2015-10-13 52 views
1

我有一组包含键值对或翻译的字符串格式30+文件的第N行:如何删除一堆文件

key=some text 

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

什么是一个简单的方法,从一堆文件中删除数字(例如,第310行)的行?

+3

要从一堆文件中删除第310行,您可以执行'sed -i.bak'310d'文件*' – user000001

+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

4
sed -i '' '310d' file1 file2 ... 

将所有文件指定的保持没有备份副本删除线310。 由您定义的全过程是这样的:

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 

,但更简单的方法是:

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

,意思是“删除每行开头‘的myKey =’从$ ALL_FILES保持没有备份副本”。

+1

是的,实际上这是一个更好的主意,因为您不必担心“所有文件**真的**在#310行具有相同的值?”。祝你们好运。 – shellter