否定字符中的单引号 Class

Negate Single Quote In Character Class

我有以下代码,我试图使用 SED 将 assign 替换为 always @(*)

本质上我试图忽略字符 class 中的 ' 但 SED 似乎仍然匹配它。如果该行包含 ' 我不希望 sed 捕获该行(我的正则表达式比这复杂得多,但我希望 sed 捕获我的正则表达式的行并忽略与我的正则表达式匹配但包含的行')

echo "assign sample_signal = '0;" | sed '/[^\x27]/ {s/assign/always @(*)/g}'

结果:always @(*) sample_signal = '0;

请试试这个 (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,忽略带有 ' 的行。

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

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

如果只有一个s命令可以应用,你也可以省略大括号:

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

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

只需在任何需要 ':

的地方使用 '\''
$ echo "f'oo" | sed 's/'\''o/X/'
fXo

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