我有一个看起来像的文件:
ignoretext
START
a b
c d
e
END
ignoretext
START
f g h
i
END
ignoretext
我想将其翻译成以下行:
a b c d e
f g h i
答案 0 :(得分:5)
以下是使用awk
awk '/END/ {ORS=RS;print "";f=0} f; /START/ {ORS=" ";f=1}' file
a b c d e
f g h i
添加了一个在行尾不提供空间的版本。这可能是更短的方式
awk 'a && !/END/ {printf FS} /END/ {print "";f=a=0} f {printf "%s",$0;a++} /START/ {f=1}'
a b c d e
f g h i
答案 1 :(得分:3)
这是另一个使用GNU sed
的变体:
sed -n '/START/,/END/{:a;/START/d;/END/!{N;ba};s/\n/ /g;s/ END//;p}' file
a b c d e
f g h i
以更易读的格式说明:
sed -n ' # Suppress default printing
/START/,/END/ { # For the range between /START/ and /END/
:a; # Create a label a
/START/d # If the line contains START, delete it
/END/! { # Until a line with END is seen
N # Append the next line to pattern space
ba # Branch back to label a to repeat
}
s/\n/ /g # Remove all new lines
s/ END// # Remove the END tag
p # Print the pattern space
}' file
答案 2 :(得分:3)
$ awk 'f{ if (/END/) {print rec; rec=sep=""; f=0} else {rec = rec sep $0; sep=" "} } /START/{f=1}' file
a b c d e
f g h i
答案 3 :(得分:2)
Jotne的awk
解决方案可能是最干净的,但是使用GNU的sed
版本可以做到这一点:
sed -ne '/START/,/END/{/\(START\|END\)/!H}' \
-e '/END/{s/.*//;x;s/\n/ /g;s/^ *\| *$//\p}'