使用 Sed 删除包含非字母的行

Using Sed to delete lines which contain non alphabets

以下正则表达式在 Notepad++ 中按预期工作:

^.*[^a-z\r\n].*$

但是,当我尝试将它与 sed 一起使用时,它不起作用。

sed -r 's/\(^.*[^a-z\r\n].*$\)//g' wordlist.txt

您可以使用:

sed -i '/[^a-z]/d' wordlist.txt

这将删除具有非字母字符的每一行(无需指定换行符)

编辑:

你的正则表达式不起作用,因为你正在尝试匹配

( bracket
^ beginning of line
...
$ end of line
) bracket

因为您没有括号和行首,所以您的正则表达式根本不匹配任何内容。

注意,也是

的表达式
s/\(^.*[^a-z\r\n].*$\)//g'

不会删除一行,而是用空行替换它

编辑2:

注意,在 sed 中使用 -r 标志改变了 \(\) 的行为,没有 -r 标志它们是组指示符,但是有 -r标记它们只是括号...

两件事:

Sed 是一个流编辑器。它一次处理一行输入。这意味着搜索和替换命令等只能看到当前行。相比之下,Notepad++ 将整个文件保存在内存中,因此它的搜索表达式可以跨越两行或更多行。

您的命令 sed -r 's/\(^.*[^a-z\r\n].*$\)//g' wordlist.txt 包括 \(\)。这些意味着真正的(即非转义的)圆括号。所以命令说找到以 ( 开头并以 ) 结尾的行,中间有一些其他字符,然后将其替换为空。将命令重写为 sed -r 's/^.*[^a-z\r\n].*$//g' wordlist.txt 应该会产生预期的效果。您也可以删除 \r\n 以提供 sed -r 's/^.*[^a-z].*$//g' wordlist.txt。但是这些都不会与 Notepad++ 命令完全相同,因为它们会留下空行。所以你可能会发现命令 sed -r '/^.*[^a-z].*$/d' wordlist.txt 更接近你真正想要的。