删除令牌之间的换行符

时间:2013-04-09 20:56:12

标签: bash sed grep

我有一个文件,其中包含跨越多行的一些信息。为了使某些其他bash脚本我必须工作属性,我需要这些信息都在一行上。但是,我显然不想删除文件中的所有换行符。

我想要做的是替换换行符,但只在所有STARTINGTOKEN和ENDINGTOKEN对之间,这两个令牌总是在不同的行上(但从不混淆在一起,例如连续两个STARTINGTOKEN是不可能的在ENDINGTOKEN之前。)

我发现我可以删除新行 tr“\ n”“” 而且我还发现我可以匹配多行的模式 sed -e'/ STARTINGTOKEN /,/ ENDINGTOKEN /!d'

但是,我无法弄清楚如何在保持文件的其余部分不受影响的情况下组合这些操作。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

你正在寻找这个吗?

 awk '/STARTINGTOKEN/{f=1} /ENDINGTOKEN/{f=0} {if(f)printf "%s",$0;else print}' file

示例:

kent$  cat file
foo
bar
STARTINGTOKEN xx
1
2
ENDINGTOKEN yy
3
4
STARTINGTOKEN mmm
5
6
7
nnn ENDINGTOKEN
8
9

kent$  awk '/STARTINGTOKEN/{f=1} /ENDINGTOKEN/{f=0} {if(f)printf "%s",$0;else print}' file
foo
bar
STARTINGTOKEN xx12ENDINGTOKEN yy
3
4
STARTINGTOKEN mmm567nnn ENDINGTOKEN
8
9

答案 1 :(得分:0)

这似乎有效:

 sed -ne '/STARTINGTOKEN/{ :next ; /ENDINGTOKEN/!{N;b next;}; s/\n//g;p;}' "yourfile"

一旦找到起始标记就会循环,拾取行直到找到结束标记,然后删除所有嵌入的换行符并打印出来。然后重复。

答案 2 :(得分:0)

使用awk:

awk '$0 ~ /STARTINGTOKEN/ || l {l=sprintf("%s%s", l, $0)} 
     /ENDINGTOKEN/{print l; l=""}' input.file

答案 3 :(得分:-1)

这可能适合你(GNU sed):

sed '/STARTINGTOKEN/!b;:a;$bb;N;/ENDINGTOKEN/!ba;:b;s/\n//g' file

或:

sed -r '/(START|END)TOKEN/,//{/STARTINGTOKEN/{h;d};H;/ENDINGTOKEN/{x;s/\n//gp};d}' file