【发布时间】:2019-08-24 10:00:25
【问题描述】:
我想在 tcl 脚本中使用 sed 来修改包含字符串的文件(存储在 $file 中):
prbs_match_out
到
prbs_match_out
尝试:
exec /bin/sed -i {s/(ch0_prbs_match_dual3_int & ch0_prbs_match_dual2_int & ch0_prbs_match_dual1_int & ch0_prbs_match_int) & ( ch1_prbs_match_dual3_int & ch1_prbs_match_dual2_int & ch1_prbs_match_dual1_int & ch1_prbs_match_int)/ch0_prbs_match_int & ch1_prbs_match_int/g} $file
上述 sed 命令不起作用(得到不正确的替换)。如何在 sed 中处理圆括号和 & 符号?
【问题讨论】:
-
您能否将您的问题简化为“将任何以
prbs_match_out <=开头的行替换为prbs_match_out <= ch0_prbs_match_int & ch1_prbs_match_int;,或者您所包含的大行真的是您需要修复的唯一prbs_match_out <=版本吗?另外,请阅读grymoire.com/Unix/Sed.html。祝你好运。 -
我只想修复行(唯一)
prbs_match_out <= (ch0_prbs_match_dual3_int & ch0_prbs_match_dual2_int & ch0_prbs_match_dual1_int & ch0_prbs_match_int) & ( ch1_prbs_match_dual3_int & ch1_prbs_match_dual2_int & ch1_prbs_match_dual1_int & ch1_prbs_match_int); -
另请注意,
sed无法轻松匹配跨越多行文本的模式。在您的示例数据中不清楚这是一行连续的文本还是跨多行格式化。您需要转义括号和&字符,因为它们对于sed正则表达式具有特殊含义。所以(也许)s/\(ch0_prbs_match_dual3_int \& ....\)... 根据您使用的 sed 版本以及您包含的任何选项,您可能不需要转义括号。最好先让一个小样本工作,然后在你的全线上尝试。祝你好运。 -
在 sed 的 BRE 中,括号和 & 号没有特殊含义。
&确实 在s命令的replacement 部分具有特殊含义。如果您使用sed -r或sed -E运行sed,那么您使用的是ERE,并且括号在模式中变得特殊。 -
@LokSas,您的问题的格式使其难以重现。您的输入是否包含换行符?多个空格是否重要?
标签: regex string sed tcl substitution