我需要一个正则表达式,它能让我进入 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 语言环境中形成一个有效(尽管可能未定义)字符。