【问题标题】:How to remove lines that match exact phrasse on Linux?如何删除与 Linux 上的确切短语匹配的行?
【发布时间】:2017-08-06 04:41:00
【问题描述】:

我的文件包含两行带有 Unicode(可能)字符的行:

▒▒▒▒=

▒▒▒=

我希望从文件中删除这两行。

我搜索了一下,发现可以使用这个命令来删除非 UTF-8 字符:

iconv -c -f utf-8 -t ascii file

但它会像这样留下这两行:

=

=

我找不到如何删除匹配(不仅包含,而是匹配)某些短语的行,在我的例子中:=

更新:我发现当我将“=”行重定向到其他文件并打开文件时,它包含不需要的行:^A= 我无法匹配 sed 删除它。

【问题讨论】:

  • grep -v '^whatever$' file 将删除 ARE whatever 的行。这就是你要找的全部吗?如果没有,请编辑您的问题以澄清。
  • 可能会使用grep -vFx(反向匹配,固定字符串并匹配整行),然后从模式中移除锚点。
  • @EdMorton 使用grep 强制用户创建一个新文件。使用sed 允许用户在不复制-cleared- 文件的情况下“就地”替换。那么sed 不是更好吗?
  • 取决于您对better 的标准是什么。只有一些 seds 允许“就地”编辑,并且那些在不同的操作系统上有不同的参数这样做,因此功能不可移植。我怀疑 grep 会比 sed 快,因为这是它设计的操作。 sed 并没有真正进行“就地”编辑,它只是在内部创建临时文件,所以你真正能说的是sed -i '.bk' '/^whatever$/d' filegrep -v '^whatever$' file > tmp && mv tmp file 更简短一点。所以 sed “更好” - idk。
  • @Ed Morton - “grep -v” 类型的命令不适用于在“vim”中打开文件时显示的特殊字符。当我将该命令的输出重定向到一个新文件并使用 vim 打开时,我看到行:^A= - 当我匹配“A=”时,它什么也没找到。

标签: awk sed


【解决方案1】:

这可能对你有用(GNU sed):

sed '/^\(\o342\o226\o222\)\+=/d' file

用途:

sed -n l file 

查找 unicode 字符的八进制表示,然后使用正则表达式中的\o... 元字符进行匹配。

编辑:

要删除仅包含 = 的行,请使用:

sed '/^\(\o342\o226\o222\)\*=\s*$/d' file

【讨论】:

  • 帖子的问题是“如何删除匹配'='的文件行,没有任何其他字符”。
  • @Auzias 你是对的,我已经相应地修改了解决方案。
  • 我的意思是它相当笼统,而不只是删除等于“=”的行。示例我要删除的行包含以下字符: $ / : 。 ,所以这不起作用。
【解决方案2】:

这里是清除这些行的命令:

sed -i 's/^=$//g' your_file

如评论中所述,您也可以使用grep -v '^whatever$' your_file > cleared_file。请注意,此解决方案需要设置不同的输出(cleared_file),而sed-解决方案允许您“就地”修改内容。

【讨论】:

  • 我认为它可能会起作用,但我有一条左下线:^A= 通过 vim 可见,而不是通过 cat
猜你喜欢
  • 2019-07-09
  • 1970-01-01
  • 2017-01-12
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
相关资源
最近更新 更多