否定字符类中的单引号

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 中指出的那样,将命令括在双引号中可能会产生不良影响。您可能需要转义美元符号 (\$) 以避免在您的模式中出现不必要的变量扩展)和双转义反斜杠:\\\

【讨论】:

以上是关于否定字符类中的单引号的主要内容,如果未能解决你的问题,请参考以下文章

python脚本入参的单、双引号

Python中的单引号与双引号[关闭]

怎样用JS把字符串中的单引号转换成双引号

Oracle中的单引号怎么转义

Python中的单引号双引号三引号

shell中的单引号和双引号的区别