否定字符中的单引号 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
我有以下代码,我试图使用 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