我有以下代码,试图使用SED将assign
替换为always @(*)
。
本质上,我试图忽略字符类中的'
,但SED似乎仍然与之匹配。如果行包含'
,我不希望sed捕获该行(我的正则表达式比这复杂得多,但是我希望sed捕获正则表达式的行,而忽略与我的正则表达式匹配但包含一个正则表达式的行'
)
echo "assign sample_signal = '0;" | sed '/[^\x27]/ {s/assign/always @(*)/g}'
结果:always @(*) sample_signal = '0;
答案 0 :(得分:2)
请尝试一下(GNU sed):
$ echo "assign sample_signal = '0;" | sed -n '/[\x27]/!{s/assign/always @(*)/g; p}'
$ echo "assign sample_signal = 0;" | sed -n '/[\x27]/!{s/assign/always @(*)/g; p}'
always @(*) sample_signal = 0;
您犯了两个错误:
1. /[^\x27]/
表示匹配任何不是'
的字符,但是有很多不是'
的字符,因此正则表达式仍然会匹配。
2.您没有使用-n
来抑制输出,因此无论是否匹配 s ,都不会打印出来。
所以我更改为/[\x27]/!{}
,这意味着当\x27
匹配时,不执行块{}
。
(用sed
来说,将在不匹配时执行 。)
通过-n
开关和该块中的p
,带有'
的行将被忽略。
答案 1 :(得分:2)
只需在需要'\''
的任何地方使用'
:
$ echo "f'oo" | sed 's/'\''o/X/'
fXo
$ echo "f'oo" | sed 's/[^'\'']o/X/'
f'X
答案 2 :(得分:1)
您可以将sed命令括在双引号中,并简单地使用/'/!
将命令应用于不包含引号的行:
echo "assign sample_signal = '0;" | sed "/'/! {s/assign/always @(*)/g;}"
如果仅应用一个s
命令,您也可以省略花括号:
echo "assign sample_signal = '0;" | sed "/'/! s/assign/always @(*)/g"
正如@EdMorton在注释中指出的那样,用双引号引起来的命令可能会产生不良影响。您可能需要对美元符号(\$
)进行转义以避免在模式中进行不必要的变量扩展),并使用双转义反斜杠:\\\
。