我当然错过了一些基本的东西。我的文件包含
之类的行fooLOCATION=sdfmsvdnv
fooLOCATION=
barLOCATION=sadssf
barLOCATION=
我希望删除所有以LOCATION=
结尾的行。
sed -i '/LOCATION=$/d' file
没有做,它没有删除任何东西,我尝试了无穷无尽的变化,但我没有得到它。什么内联sed命令可以做到这一点?
答案 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上存在额外的回车符。修改上面的四个命令接受任何一个,我们得到
sed -in '/LOCATION=\r\{0,1\}$/!p' file
sed -i '/LOCATION=\r\{0,1\}$/d' file
sed -in '/^\r\{0,1\}$/!{/LOCATION=\r\{0,1\}$/!p}' file
sed -i '/^\r\{0,1\}$/d;/LOCATION=\r\{0,1\}$/d' file
请注意,在每个版本中,我们在行尾之前允许选择\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=
位于该行的末尾,或者该模式后面有任何可选的空格,则会删除该行。