在字符类中否定单引号

3
我有以下代码,我想使用SED将assign替换为always @(*)
本质上,我试图忽略字符类中的',但是SED似乎仍然能够匹配它。如果行包含',我不希望SED捕获该行(我的正则表达式比这个复杂得多,但我希望SED捕获符合我的正则表达式的行,并忽略与我的正则表达式匹配但包含'的行)。
echo "assign sample_signal = '0;" | sed '/[^\x27]/ {s/assign/always @(*)/g}'

Result: always @(*) sample_signal = '0;

3个回答

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 命令来抑制输出,因此无论是否匹配成功,替换或不替换,该行都将被打印出来。
所以我改为使用 /[\x27]/!{},这意味着当匹配到 \x27 时,不执行块 {}。(在 sed 中,它将在未匹配时执行。)
通过使用 -n 开关和块中的 p,可以忽略带有 ' 的行。

2
只需在需要使用 ' 的任何位置使用 '\'' 即可:最初的回答。
$ echo "f'oo" | sed 's/'\''o/X/'
fXo

$ echo "f'oo" | sed 's/[^'\'']o/X/'
f'X

1

您可以将sed命令用双引号括起来,并简单地使用/'/!将命令应用于不包含引号的行:

echo "assign sample_signal = '0;" | sed "/'/! {s/assign/always @(*)/g;}"

如果只有一个要应用的 s 命令,您也可以省略大括号:
echo "assign sample_signal = '0;" | sed "/'/! s/assign/always @(*)/g"

正如@EdMorton在评论中指出的那样,将命令用双引号括起来可能会产生不必要的影响。您可能需要转义美元符号(\$)以避免在模式中发生意外的变量扩展,并且需要双重转义反斜杠:\\\

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接