K.M*_*zur 1 grep regular-expression
我需要一个正则表达式,它可以让我进入 file.txt 行,这些行除了字母或/和数字和破折号之外还有其他内容。
file.txt 看起来像这样
zigzag-p
100-ig
inter-op
Run Code Online (Sandbox Code Playgroud)
但它有 47k 行 :) 所以它可能会发生在 file.txt 中我们会有
a=opera
a-10-b
zigzag-p
100-ig
inter-op
out&-yu
Run Code Online (Sandbox Code Playgroud)
我需要一个正则表达式,它可以找到除数字和/或字母和破折号以外的所有行,理想情况下我可以与 grep 一起使用:)
grep '[^[:alnum:]-]'
Run Code Online (Sandbox Code Playgroud)
返回包含任何一个字符的行,这些字符-
在语言环境中既不被归类为字母数字,也不被归类为字母数字。
请注意,它不仅限于字母文字,还包括非字母文字的单词成分,例如中文或日文字符。它不包括结合附加符号虽然该装置行等Ste?phane
,其中é
作为被表达e
,接着由U + 0301组合重音符将被报告。
请注意,对于许多grep
实现,只要所有有效字符都是 alnums 或-
.
grep -vx '[[:alnum:]-]*'
Run Code Online (Sandbox Code Playgroud)
(如果您希望它也报告空行,请将*
(0 或更多)替换为+
(1 或更多))
在这些情况下,使用某些grep
实现会更好。使用 GNU grep
,您可能需要添加该-a
选项,以便即使检测到输入的文本无效,它也能正常工作。
更一般地说,可移植性,您无法获得文本实用程序的太多保证,例如grep
当输入不是有效文本时。这包括不形成有效字符的字节序列,以及包含 NUL 字符或超长行的行。
如果要限制为 POSIX 可移植字符集 (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789) 的 52 个字母和 10 个数字,则可以将语言环境设置为C
/ POSIX
:
LC_ALL=C grep '[^[:alnum:]-]'
Run Code Online (Sandbox Code Playgroud)
这也有助于解决字符解码问题,因为所有字节在 C 语言环境中形成一个有效(尽管可能未定义)的字符。