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

时间:2015-02-09 08:52:40

标签: regex bash sed

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

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

然而,当我尝试将它与sed一起使用时,它无法工作。

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

2 个答案:

答案 0 :(得分:2)

您可以使用:

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

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

编辑:

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

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

由于你没有括号,然后是行的开头,你的正则表达式根本就不匹配。

注意,也是

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

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

EDIT2:

注意,在使用-r标志的sed中,\(\)的行为会更改-r标记,而不是-r标记,但它们是{{1}}标记只是括号......

答案 1 :(得分:1)

两件事:

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更接近你真正想要的。