【问题标题】:Using Sed to delete lines which contain non alphabets使用 Sed 删除包含非字母的行
【发布时间】:2015-04-08 23:04:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • \r\n 不会出现在逐行工作的 sed 的默认行为中。如果需要在模式中(不是在这种情况下),您需要首先将文件加载到缓冲区中。 \r\n 可以在这里替换为 $(但不在课堂上)

标签: regex bash sed


【解决方案1】:

你可以使用:

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

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

编辑:

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

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

由于您没有括号,然后是行首,因此您的正则表达式根本不匹配任何内容。

注意,也是一种表达方式

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

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

EDIT2:

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

【讨论】:

    【解决方案2】:

    两件事:

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

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 2015-01-21
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2015-10-04
      相关资源
      最近更新 更多