次の awk スクリプトがその役割を果たします。
#!/usr/bin/awk -f
BEGIN { FS="\t"; }
/^_begin/ { output=$2; }
$1=="_attrib1" { output=output " " $2; }
/^_end/ { print output; }
\t
タブ ( ) を出力フィールド区切り記号にするかどうかを指定していません。もしそうなら、私に知らせてください。答えを更新します。(またはできます。それは簡単です。)
もちろん、恐ろしい代替手段が必要な場合 (ハロウィーンが近づいているため)、次を使用したソリューションを次に示しますsed
。
$ sed -ne '/^_begin./{s///;h;};/^_attrib1[^0-9]/{s///;H;x;s/\n/ /;x;};/^_end/{;g;p;}' input.txt
hello world ! super duper yet another value
これはどのように作動しますか?ムワハハ、聞いてよかった。
/^_begin./{s///;h;};
-- が表示されたら_begin
、それを取り除き、残りの行を sed の「ホールド バッファ」に格納します。
/^_attrib1[^0-9]/{s///;H;x;s/\n/ /;x;};
-- が表示されたら_attrib1
、それを取り除き、ホールド バッファに追加し、ホールド バッファとパターン スペースを交換し、改行をスペースに置き換え、ホールド バッファとパターン スペースを再び交換します。
/^_end/{;g;p;}
-- 最後に到達したので、ホールド バッファをパターン スペースにプルして出力します。
これは、入力フィールド区切りが単一のタブであることを前提としています。
とても簡単。誰sed
が難解だと言った?!