在tcl脚本中使用sed进行字符串替换-字符串包含圆括号

时间:2019-04-03 01:05:41

标签: regex string sed tcl substitution

我想在tcl脚本中使用sed修改包含字符串的文件(存储在$ file中):

  

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);

  

prbs_match_out <= ch0_prbs_match_int&ch1_prbs_match_int;

尝试:

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中的圆括号和&符?

4 个答案:

答案 0 :(得分:1)

您是否考虑过将Tcl用于此就地转换,例如通过其[regsub]命令:

set x [regsub {(\([^)]*\))} $x ch0_prbs_match_int]
set x [regsub {(\([^)]*\))} $x ch1_prbs_match_int]
  

仅修复该行(唯一)

这假设变量x保留了文件的内容,并且可以通过注意匹配的括号对来唯一标识要替换的行元素。

答案 1 :(得分:1)

如果变量中包含文件内容(或文件的一行),则可以使用string map命令将一个子字符串替换为其他文本。

答案 2 :(得分:1)

我知道了-tcl的“字符串映射”命令起作用了。感谢您的帮助。

package require Tcl 8.5

package require fileutil

# Parameters for the replacement 
set from "(   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)"
set to "ch0_prbs_match_int & ch1_prbs_match_int"

# Which file to replace 
set checkingFile /proj/dada/test.v

# Make a command fragment that performs the replacement on a supplied string
set replacementCmd [list string map [list $from $to]]

# For single file replacement 
fileutil::updateInPlace $checkingFile $replacementCmd

答案 3 :(得分:0)

BRE(基本正则表达式)中,仅六个字符必须转义 要按字面意思处理:^$.*\[
另外,你需要逃脱 &的{​​{1}}命令的REPLACEMENT部分的s,因为sed&中具有匹配部分的特殊含义。
结果,您可以说出这样的话:

PATTERN

#!/usr/bin/tclsh set file {yourfilename} 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;/} $file 修改为:

$file