删除行尾包含模式的行

man*_*nes 3 sed

我当然很想念一些基本的东西。我的文件包含以下行

fooLOCATION=sdfmsvdnv

fooLOCATION=

barLOCATION=sadssf

barLOCATION=
Run Code Online (Sandbox Code Playgroud)

我想删除所有以结尾的行LOCATION=

sed -i '/LOCATION=$/d' file
Run Code Online (Sandbox Code Playgroud)

不会这样做,它不会删除任何内容,而且我尝试了无尽的变化,但我不明白。什么内联sed命令可以做到这一点?

cla*_*123 5

你的命令对我有用:

$ sed -i '/LOCATION=$/d' file
Run Code Online (Sandbox Code Playgroud)

结果,使用以下方式查看cat

$ cat file
fooLOCATION=sdfmsvdnv


barLOCATION=sadssf
Run Code Online (Sandbox Code Playgroud)

笔记

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

$ dos2unix file
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*hew 5

这里有两种方法,或者使用以下命令打印所有不匹配的行

sed -in '/LOCATION=$/!p' file
Run Code Online (Sandbox Code Playgroud)

或删除所有与

sed -i '/LOCATION=$/d' file
Run Code Online (Sandbox Code Playgroud)

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

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

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

sed -in '/^$/!{/LOCATION=$/!p}' file
Run Code Online (Sandbox Code Playgroud)

首先检查一行是否不为空,并且仅在行不为空时检查是否应打印。我们可以将第二个选项修改为

sed -i '/^$/d;/LOCATION=$/d' file
Run Code Online (Sandbox Code Playgroud)

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


通过指定模式中的差异,我们可以修改选项以使用不同的行尾。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

请注意,在每种情况下,我们\r在行尾之前都允许一个可选项。我们使用大括号表示法,因为sed在正常模式下不支持问号可选的量词(使用GNU sed 的r选项启用扩展的正则表达式,我们可以替换\{0,1\}?)。


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