否定字符类中的单引号

时间:2019-01-20 05:21:08

标签: regex bash sed regex-negation single-quotes

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

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

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

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

3 个答案:

答案 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在注释中指出的那样,用双引号引起来的命令可能会产生不良影响。您可能需要对美元符号(\$)进行转义以避免在模式中进行不必要的变量扩展),并使用双转义反斜杠:\\\

相关问题