如何使用sed在多行上进行复杂的替换?

时间:2011-03-03 09:12:13

标签: linux sed

我想在一组文件中进行此替换:

替换:

KEY
KEY1|VAL1
KEY
KEY2|VAL2

by:

KEY
KEY1|VAL1

例如:

KEY
KEY|sde
KEY
KEY|45g

通过

KEY
KEY|sde

简而言之,我需要删除KEY \ n KEY | VAL对的第二次出现。我不擅长使用sed。

4 个答案:

答案 0 :(得分:4)

如果我理解你的问题(我可能不会),这是一个解决方案:

sed -ne '/^KEY$/{p;n;p;n;n}' file

说明:

在一行中找到KEY时:

  • p - 打印
  • n;p - 转到下一行并打印出来。
  • n;n - 跳过接下来的两行。

...并重复。

编辑(解释继续):

  • -n告诉sed除非明确指示(p),否则不要打印一行。
  • 此处并非严格要求-e。它表示以下字符串是sed表达式。

答案 1 :(得分:0)

sed -e 'N;/key2\|val2/ d' your_file.txt应该这样做,注意\是引用|否则你的shell可能会错误地解释命令。

答案 2 :(得分:0)

您可以尝试使用awk。请注意,只更改了所需模式的第二个实例。

# cat file
KEY
KEY1|VAL1
blah
blah
KEY
KEY2|VAL2
junk
junk
KEY
KEY3|VAL3
KEY
KEY4|VAL4
KEY
KEY5|VAL5

$ awk '/^KEY$/&&!f&&!x{s=$0;getline;s=s"\n"$0;f=1;print s;next}f&&/^KEY$/{print s;getline;x=1;f=0;next}1' file
KEY
KEY1|VAL1
blah
blah
KEY
KEY1|VAL1
junk
junk
KEY
KEY3|VAL3
KEY
KEY4|VAL4
KEY
KEY5|VAL5

答案 3 :(得分:-1)

如果您还使用其他工具,这是一个问题吗?我刚试过:

sort "file" | uniq | sed '/KEY2/d'

您甚至可以使用sed模拟uniq,请检查:http://sed.sourceforge.net/sed1line.txt

希望有所帮助