替换包含特殊字符的文本中的行(数学方程)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文本的主要内容,如果未能解决你的问题,请参考以下文章