删除行尾包含模式的行

时间:2016-03-10 22:46:23

标签: sed

我当然错过了一些基本的东西。我的文件包含

之类的行
fooLOCATION=sdfmsvdnv

fooLOCATION=

barLOCATION=sadssf

barLOCATION=

我希望删除所有以LOCATION=结尾的行。

sed -i '/LOCATION=$/d' file

没有做,它没有删除任何东西,我尝试了无穷无尽的变化,但我没有得到它。什么内联sed命令可以做到这一点?

3 个答案:

答案 0 :(得分:4)

这里有两种方法,用

打印所有不匹配的行
sed -in '/LOCATION=$/!p' file

或使用

删除所有匹配的名称
sed -i '/LOCATION=$/d' file

第一个使用 n 命令行选项来禁止打印行的默认操作。然后,我们测试以LOCATION=结尾的行并反转模式(仅保留那些不匹配的行)。当我们得到一条理想的线时,我们用p选项打印它。

第二个查找与行尾模式匹配的行,并删除那些行。

您的文件包含空白行,这两行都保留了这些行。如果我们不想保留这些,我们可以将第一个选项更改为

sed -in '/^$/!{/LOCATION=$/!p}' file

首先检查一行是否为空,如果不是空的话,只会检查是否应该打印。我们可以将第二个选项修改为

sed -i '/^$/d;/LOCATION=$/d' file

删除空白行,然后检查是否删除其他模式。

我们可以通过指定模式中的差异来修改选项以使用不同的行结尾。 Unix / Linux(\n)和Windows(\r\n)上的行结尾之间的区别是Windows上存在额外的回车符。修改上面的四个命令接受任何一个,我们得到

  1. sed -in '/LOCATION=\r\{0,1\}$/!p' file
  2. sed -i '/LOCATION=\r\{0,1\}$/d' file
  3. sed -in '/^\r\{0,1\}$/!{/LOCATION=\r\{0,1\}$/!p}' file
  4. sed -i '/^\r\{0,1\}$/d;/LOCATION=\r\{0,1\}$/d' file
  5. 请注意,在每个版本中,我们在行尾之前允许选择\r。我们使用大括号表示法,因为sed在正常模式下不支持问号可选量词(使用GNU sed的 r 选项来启用扩展正则表达式,我们可以用\{0,1\}替换? #!/usr/bin/python import os file_name = os.getenv('map_input_file') print file_name )。

    在Windows shell上,上述所有选项都需要双引号而不是单引号。

答案 1 :(得分:3)

你的命令对我有用:

$ sed -i '/LOCATION=$/d' file

结果,使用cat查看:

$ cat file
fooLOCATION=sdfmsvdnv


barLOCATION=sadssf

注意

如果文件具有非Unix行结尾,例如来自Windows的具有DOS格式的行结尾的文件,则可能是失败的原因。一个典型的补救措施是使用dos2unix

$ dos2unix file

此转换器修复了换行问题,因此file现在将具有Unix样式的行结尾。 Sed现在应该正确识别那些行结尾,所以重试你的sed命令它应该可以工作。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -i '/LOCATION=\s*$/d' file

如果LOCATION=位于该行的末尾,或者该模式后面有任何可选的空格,则会删除该行。