Linux将文本块转换为文本行

时间:2014-05-30 20:06:44

标签: linux bash text awk

我有一个看起来像的文件:

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

4 个答案:

答案 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}'