否定字符类中的单引号
Posted
技术标签:
【中文标题】否定字符类中的单引号【英文标题】:Negate Single Quote In Character Class 【发布时间】:2019-01-20 05:21:07 【问题描述】:我有以下代码,我尝试使用 SED 将 assign
替换为 always @(*)
。
基本上我试图忽略字符类中的'
,但 SED 似乎仍然匹配它。如果该行包含'
,我不想 sed 捕获该行(我的正则表达式比这复杂得多,但我希望 sed 捕获我的正则表达式的行并忽略与我的正则表达式匹配但包含 @987654325 的行@)
echo "assign sample_signal = '0;" | sed '/[^\x27]/ s/assign/always @(*)/g'
结果:always @(*) sample_signal = '0;
【问题讨论】:
【参考方案1】:请试试这个(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]/
表示匹配任何不是'
的字符,但是有很多字符不是'
,所以regex无论如何都会匹配。
2.你没有使用-n
是抑制输出,所以匹配与否,s是否粗鲁,无论如何都会打印出来。
所以我改为/[\x27]/!
,这意味着当\x27
匹配时,不执行块。
(用
sed
的话来说,它将在不匹配时执行。)
并且通过-n
开关和块中的p
,带有'
的行将被忽略。
【讨论】:
【参考方案2】:只需在需要'
的任何地方使用'\''
:
$ echo "f'oo" | sed 's/'\''o/X/'
fXo
$ echo "f'oo" | sed 's/[^'\'']o/X/'
f'X
【讨论】:
【参考方案3】:您可以用双引号将您的 sed 命令括起来,然后简单地使用 /'/!
将您的命令应用于不包含引号的行:
echo "assign sample_signal = '0;" | sed "/'/! s/assign/always @(*)/g;"
如果只有一个s
命令可以应用,你也可以省略大括号:
echo "assign sample_signal = '0;" | sed "/'/! s/assign/always @(*)/g"
正如@EdMorton 在 cmets 中指出的那样,将命令括在双引号中可能会产生不良影响。您可能需要转义美元符号 (\$
) 以避免在您的模式中出现不必要的变量扩展)和双转义反斜杠:\\\
。
【讨论】:
以上是关于否定字符类中的单引号的主要内容,如果未能解决你的问题,请参考以下文章