sed:我的模式可以包含“不是”字符吗?我怎么说“不是X”?

问题描述 投票:0回答:5

如何说“不是”

sed
中的某个角色?

regex sed
5个回答
78
投票
[^x]

这是一个字符类,可接受除

x
之外的任何字符。


19
投票

对于那些对所选答案不满意,根据约翰尼的评论

su[^x]
将匹配
sum
sun
,但不匹配
su

您可以使用以下语法告诉 sed

not
x
匹配行:

sed '/x/! s/su//' file

请参阅 kkeller 的回答以获取另一个示例。


10
投票

您的问题有两种可能的解释。正如其他人已经指出的那样,

[^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
内部某处,导致“泄漏”)。


2
投票

除了所有提供的答案之外,您还可以使用符号

[^:[C_CLASS]:]
来否定 sed 中的字符类,例如,
[^[:blank:]]
将匹配任何不被视为空格字符的内容。


1
投票

根据我自己的经验,并且下面的帖子支持这一点,sed 不支持使用“^”的正常正则表达式否定。我不认为 sed 有直接否定方法...但是如果您检查下面的帖子,您会看到一些解决方法。 Sed 正则表达式和子字符串否定

© www.soinside.com 2019 - 2024. All rights reserved.