如何说“不是”
sed
中的某个角色?
[^x]
这是一个字符类,可接受除
x
之外的任何字符。
对于那些对所选答案不满意,根据约翰尼的评论。
su[^x]
将匹配 sum
和 sun
,但不匹配 su
。
您可以使用以下语法告诉 sed
not
与 x
匹配行:
sed '/x/! s/su//' file
您的问题有两种可能的解释。正如其他人已经指出的那样,
[^x]
匹配不是 x
的单个字符。但空字符串也不是 x
,所以也许您正在寻找 [^x]\|^$
。
这些答案都不能扩展到多字符序列,而这通常是人们正在寻找的。你可以煞费苦心地构建类似的东西
[^s]\|s\($\|[^t]\|t\($\|[^r]\)\)\)
编写一个与
str
不匹配的正则表达式,但 sed
中更直接的解决方案是删除 与 str
匹配的任何行,然后保留其余部分;
sed '/str/d' file
Perl 5 引入了更丰富的正则表达式引擎,因此它是 Java、PHP、Python 等中的标准。由于 Perl 有助于支持
sed
语法的子集,因此您可以将简单的 sed
脚本转换为 Perl 以获取使用此扩展正则表达式方言中的有用功能,例如否定断言:
perl -pe 's/(?:(?!str).)+/not/' file
将用
str
替换不是 not
的字符串。 (?:...)
是一个非捕获组(与许多 sed
方言不同,未转义的括号是 Perl 中的元字符),(?!str)
是一个否定断言;为了使正则表达式匹配,字符串中该位置之后的文本不得为 str
。 +
重复此模式,直到无法匹配为止。请注意,断言在匹配中的每个位置都需要为真,因此我们一次用 .
匹配一个字符(新手经常会犯这个错误,并且错误地仅在较长模式的开头处断言,但这可能会导致错误)匹配 str
内部某处,导致“泄漏”)。
除了所有提供的答案之外,您还可以使用符号
[^:[C_CLASS]:]
来否定 sed 中的字符类,例如,[^[:blank:]]
将匹配任何不被视为空格字符的内容。
根据我自己的经验,并且下面的帖子支持这一点,sed 不支持使用“^”的正常正则表达式否定。我不认为 sed 有直接否定方法...但是如果您检查下面的帖子,您会看到一些解决方法。 Sed 正则表达式和子字符串否定