我想在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中的圆括号和&符?
答案 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