2

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

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

我发现我可以用 tr "\n" " " 删除换行符,我还发现我可以用 sed -e '/STARTINGTOKEN/,/ENDINGTOKEN/!d' 匹配多行的模式

但是,我无法弄清楚如何组合这些操作,同时保持文件的其余部分保持不变。

有什么建议么?

4

4 回答 4

2

你在找这个吗?

 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
于 2013-04-09T21:06:29.770 回答
0

使用 awk:

awk '$0 ~ /STARTINGTOKEN/ || l {l=sprintf("%s%s", l, $0)} 
     /ENDINGTOKEN/{print l; l=""}' input.file
于 2013-04-09T21:14:04.203 回答
0

这似乎有效:

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

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

于 2013-04-09T21:10:37.530 回答
-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
于 2013-04-10T08:00:46.360 回答