以下正则表达式在Notepad ++中按预期工作:
^.*[^a-z\r\n].*$
然而,当我尝试将它与sed一起使用时,它无法工作。
sed -r 's/\(^.*[^a-z\r\n].*$\)//g' wordlist.txt
答案 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
更接近你真正想要的。