使用sed来删除含有非英文字母

问题描述:

下面的正则表达式将按预期在记事本++线:使用sed来删除含有非英文字母

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

然而,当我尝试使用SED,它不会工作使用。

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

'\ r'和'\ n'不会发生在逐行工作的sed的默认行为中。如果需要模式,则需要先将文件加载到缓冲区中(不是这种情况下)。 '\ r'和'\ n'可以用'$'替代(但不在课程中) – NeronLeVelu 2015-02-09 09:16:41

你可以使用:

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国旗他们只是括号...

+0

是的,你的作品。但为什么我的正则表达式不工作? – 2015-02-09 08:56:13

两件事:

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