如何删除一堆文件的第N行

时间:2015-10-13 17:27:57

标签: linux bash sed

我有一组包含键值对或翻译字符串的30多个文件,格式为:

key=some text

有时我想从这些文件中删除一些密钥,我要做的是打开其中一个,找到包含我要删除的密钥的行(例如第310行),然后从其他文件中手动删除该行。这些文件中的键按字母顺序排序,因此如果键出现在文件的第310行,则它出现在每个其他文件的第310行。

从一堆文件中按号码删除一行(例如第310行)的简单方法是什么?

2 个答案:

答案 0 :(得分:4)

KEY=mykey
FILE1=myfile
ALL_FILES="file1 file2 ..."
sed -i '' $(grep -n "^$KEY=" $FILE1 | head -1 | sed -E 's/^([0-9]+):.*/\1/')d $ALL_FILES

将从指定的所有文件中删除行310,不保留备份副本。 您定义的完整过程如下:

KEY=mykey
ALL_FILES="file1 file2 ..."
sed -i '' "/^$KEY=/d" $ALL_FILES

但更简单的方法是:

{{1}}

表示"删除以' mykey ='开头的每一行来自$ ALL_FILES,不保留备份副本"。

答案 1 :(得分:1)

扩展user000001的想法,这是一种更通用的方法。

    sed -i.bak "$(grep -n keyTarget keyFile|sed 's/:.*$//')d;" files*

假设你的sed支持-i选项(大部分都支持)。

您甚至可以将其放在脚本中,而不是每次都编辑keyTarget,而只是使用命令行参数而不是keyTarget${@}

要确认这将按预期工作,请确认您只从内部部件

返回一个行号
grep -n keyTarget keyFile|sed 's/:.*$//'

在您确定永远不会发现行号已关闭的情况之前,我会将整个文件集保存到备份目录。

让脚本支持编辑多个目标会冒险,但可以完成。如果您喜欢这个并且它可以满足您的需求,但您可以使用多个目标,发布一个新问题,显示您遇到的问题。

IHTH