【问题标题】:Replace line in text containing special characters (mathematical equation) linux text替换包含特殊字符的文本中的行(数学方程)linux文本
【发布时间】: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字符,如&、`\`等
  • 这就是目标,这就是为什么我使用不同的分隔符,这不在数学方程式中。最后的结果是一样的:我无法搜索和替换方程。
  • [...] 列表中转义或包含特殊字符,这样它们就失去了特殊含义。

标签: linux bash text sed


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多