我当然很想念一些基本的东西。我的文件包含以下行
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命令可以做到这一点?
你的命令对我有用:
$ 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 命令,它应该可以工作。
这里有两种方法,或者使用以下命令打印所有不匹配的行
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 上存在额外的回车符。修改上面的四个命令以接受其中任何一个,我们得到
sed -in '/LOCATION=\r\{0,1\}$/!p' filesed -i '/LOCATION=\r\{0,1\}$/d' filesed -in '/^\r\{0,1\}$/!{/LOCATION=\r\{0,1\}$/!p}' filesed -i '/^\r\{0,1\}$/d;/LOCATION=\r\{0,1\}$/d' file请注意,在每种情况下,我们\r在行尾之前都允许一个可选项。我们使用大括号表示法,因为sed在正常模式下不支持问号可选的量词(使用GNU sed 的r选项启用扩展的正则表达式,我们可以替换\{0,1\}为?)。  
在Windows Shell上,以上所有选项都需要双引号而不是单引号。