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

时间:2011-09-22 19:58:11

标签: regex sed

如何在sed中说“不是”某个字符?

5 个答案:

答案 0 :(得分:47)

[^x]

这是一个接受除x以外的任何字符的字符类。

答案 1 :(得分:8)

根据johnny's comment 对所选答案不满意的人

'苏[^ X]'将匹配' sum'和' sun'但不是' su'。

您可以使用以下语法告诉sed notx的匹配行:

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

See kkeller's answer for another example.

答案 2 :(得分:5)

您的问题有两种可能的解释。像其他人已经指出的那样,[^x]匹配不是x的单个字符。但是空字符串也不是x,所以也许你正在寻找[^x]\|^$

这些答案都没有延伸到多字符序列,这通常是人们正在寻找的。你可以煞费苦心地建立像

这样的东西
[^s]\|s\($\|[^t]\|t\($\|[^r]\)\)\)

撰写一个与str不匹配的正则表达式,但sed中更直接的解决方案是删除 匹配的任何行{{} 1}},然后保留其余部分;

str

Perl 5引入了更丰富的正则表达式引擎,因此它是Java,PHP,Python等的标准。因为Perl有助于支持sed '/str/d' file 语法的子集,所以你可以转换一个简单的sed Perl脚本可以使用这个扩展的正则表达式方言中的有用功能,例如否定断言:

sed

会将perl -pe 's/(?:(?!str).)+/not/' file 的字符串替换为strnot是非捕获组(与许多(?:...)方言不同,非转义括号是Perl中的元字符),sed是否定断言;字符串中该位置后面的文字必须为(?!str)才能使正则表达式匹配。 str重复此模式,直到它无法匹配。注意断言如何在匹配中的每个位置都是真的,所以我们一次匹配一个字符+(新手常常会出错,并且错误地仅在例如较长模式的开头处断言,然而,可能会在.内某处匹配,从而导致泄漏")。

答案 3 :(得分:1)

根据我自己的经验,以下帖子支持这一点,sed不支持使用“^”进行正常的正则表达式否定。我不认为sed有直接的否定方法......但如果你查看下面的帖子,你会看到一些解决方法。 Sed regex and substring negation

答案 4 :(得分:0)

除了提供的所有答案之外,您还可以使用符号 [^:[C_CLASS]:] 否定 sed 中的字符类,例如,[^[:blank:]] 将匹配任何不被视为空格字符的内容。