Grep 正则表达式查找包含字母/数字/破折号以外的内容的行

Grep 正则表达式查找包含字母/数字/破折号以外的内容的行

我需要一个正则表达式,它能让我进入 file.txt 行,其中包含的内容不仅仅是字母或/和数字和破折号。

file.txt 看起来像这样

   zigzag-p
   100-ig
   inter-op

但它有大约 47k 行:)所以在 file.txt 中我们可能会出现

   a=opera
   a-10-b
   zigzag-p
   100-ig
   inter-op
   out&-yu

我需要一个正则表达式来找到除数字和/或字母和破折号以外的所有行,理想情况下我可以与 grep 一起使用:)

答案1

grep '[^[:alnum:]-]'

返回包含任意一个的行特点-在语言环境中既不属于也不被分类为字母数字。

请注意,它不仅限于字母文字的字母,还包括非字母文字的单词成分,例如中文或日文字符。它不包括组合变音符号,但这意味着将报告类似于Stéphane表示ée后跟 U+0301 组合锐音符号的行。

请注意,对于许多grep实现,只要所有有效字符都是 alnums 或 ,它将无法报告包含在语言环境中不形成有效字符的字节序列的行-

grep -vx '[[:alnum:]-]*'

(如果您希望它也报告空行,请将*(0或更多)替换为(1或更多))+

在这些情况下通过一些实现会更好地工作grep。使用 GNU grep,您可能需要添加该-a选项,以便即使它检测到输入不是有效文本,它也可以工作。

更一般地说,可移植的是,您无法通过文本实用程序获得太多保证,例如grep当输入不是有效文本时。这包括不形成有效字符的字节序列,还包括包含 NUL 字符的行或过长的行。

如果要限制为 POSIX 可移植字符集的 52 个字母和 10 个数字 (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789),可以将区域设置设置为C/ POSIX

LC_ALL=C grep '[^[:alnum:]-]'

这也有助于解决字符解码问题,因为所有字节在 C 语言环境中形成一个有效(尽管可能未定义)字符。

相关内容