替换包含特殊字符的文本中的行(数学方程)linux文本

Posted

技术标签:

【中文标题】替换包含特殊字符的文本中的行(数学方程)linux文本【英文标题】:Replace line in text containing special characters (mathematical equation) linux text 【发布时间】:2020-10-08 20:35:24 【问题描述】:

我想替换一条线,它代表数学方程的一部分:

f(x,z,time,temp)=-(2.0)/(exp(128*((x-2.5*time)*(x-2.5*time)+(z-0.2)*(z-0.2))))+(  

与上面类似的一个新的。新旧行都保存在 bash 变量中。

主要问题是数学方程式中充满了特殊字符,即使我用作方程式中未使用的分隔符特殊字符,也不允许在 bash 模式下进行正确搜索和替换。

我用过

sed -n "s|$OLD|$NEW|g" restart.k

sed -i "s|$OLD|$NEW|g" restart.k

但我总是得到错误的结果。 有什么办法解决这个问题吗?

【问题讨论】:

I get wrong results 你得到什么结果?他们怎么错了?为什么使用-n 开关?它们如何保存在 bash 变量中?这些变量的内容是什么?他们的价值观是什么?它们是如何初始化的?您确实了解sed 解析正则表达式并且正则表达式具有特殊规则,它如何解释某些字符的含义?你知道这些规则吗?请创建一个minimal reproducible example 需要转义特殊的sed字符,如&、`\`等 这就是目标,这就是为什么我使用不同的分隔符,这不在数学方程式中。最后的结果是一样的:我无法搜索和替换方程。 [...] 列表中转义或包含特殊字符,这样它们就失去了特殊含义。 【参考方案1】:

您的模式中只有*sed 是特殊的,因此请避开它并照常进行替换:

sed "s:$(sed 's:[*]:\\&:g' <<<"$old"):$new:" infile

如果你的真实样本中有更多特殊字符,那么你需要将它们添加到括号[]中;有一些例外,例如:

如果^ 字符:它可以放在[] 中的任何位置,但不能放在第一个字符,因为^ 字符首先会否定其括号表达式中的字符。 if ] 字符:应该是第一个字符,因为这个字符也用来结束括号表达式。 如果-字符:它应该是第一个或最后一个字符,因为这个字符也可以用来定义字符的范围。

【讨论】:

以上是关于替换包含特殊字符的文本中的行(数学方程)linux文本的主要内容,如果未能解决你的问题,请参考以下文章

shell的sed工具,如何删除一个文件中包含了特殊路径字符串的行? 例如文件file,里面有内容,

必须包含数字、字母、特殊字符三种的正则?

替换文本内容

Linux Sed命令在特殊字符后替换

如何在Unix下使用sed命令

BULK INSERT 后特殊字符显示不正确