2011-03-03 38 views
0

我想要做这个替代的一组文件的做多行复杂的替换:如何使用SED

取代:

KEY 
KEY1|VAL1 
KEY 
KEY2|VAL2 

由:

KEY 
KEY1|VAL1 

例如:

KEY 
KEY|sde 
KEY 
KEY|45g 

来自

KEY 
KEY|sde 

总之,我需要删除键\ n键的第二occurence | VAL对.. 我不擅长使用SED,请帮助..我有急事..

谢谢很多,

三位一体

+1

'sed'具有一些多线功能,但我怀疑你对你的任务期望过高。如果您的输入非常规则,例如每个'KEY'重复两次,并在其后面有一个'KEYx/VALx',这很简单,但根据你的说明,你可能需要查看awk或适合你的解决方案的脚本语言。 – 2011-03-03 09:28:21

+0

他们重复两次 – trinity 2011-03-03 10:05:28

回答

-1

这是个问题,如果你使用其他工具也?我只是想:

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

你甚至可以效仿的uniq使用SED,请检查:http://sed.sourceforge.net/sed1line.txt

希望帮助

+1

这将完全改变文件内容,我想这不是意图 – Bernhard 2011-03-03 09:33:02

0

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

+0

请看我编辑的问题,val2 - 实际上是一个变量 – trinity 2011-03-03 10:06:10

+1

这不是为什么'|'逃脱了(单引号已经这样做的原因是,在BRE中,一个管道是一个文字字符,除非它被转义了,在EREs('sed -r')中,你不需要转义它,因为在这个例子中你想匹配一个字符管道字符并且你正在使用BRE,你应该*不*逃脱它 – 2011-03-03 16:03:01

+0

感谢您指出,总是很好学习的东西:-) – Bernhard 2011-03-19 11:24:29

3

如果我正确理解你的问题(我可能没有),这是一个解决方案:

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

说明:

当自己在一条线上找到KEY

  • p - 打印行
  • n;p - 转到下一行并将其打印到O操作。
  • n;n - 跳过接下来的2行。

...并重复。

编辑(说明续):

  • -n告诉sed要打印的行,除非明确指示这样做(与p)。
  • 这里并不严格要求-e。它表示以下字符串是sed表达式。
+0

哇,是的,这正是我的需要! :)什么 - 为.. – trinity 2011-03-03 10:21:34

+0

我怎么做这个内联? – trinity 2011-03-03 10:31:59

+0

非标准的'-i'命令行选项适用于大多数'sed'的内联操作。 – mouviciel 2011-03-03 10:48:55

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