sedを使用してパターンに一致する行の特定の文字を置き換える方法は?
例:文字で始まるすべての行を一致させ、末尾の改行をタブに置き換えたいと思います。私は以下を使用しようとしています:(sed -e '/^[A-Z]/s/\n/\t/g'
私が興味のある行は役に立つならば常に文字で終わります)。
入力サンプル
NAME_A
12,1
NAME_B
21,2
サンプル出力
NAME_A 12,1
NAME_B 21,2
答え1
sed '/^[[:alpha:]]/{$!N;s/\n/ /;}' <<\DATA
NAME_A
12,1
NAME_B
21,2
DATA
出力
NAME_A 12,1
NAME_B 21,2
文字で始まる行を処理し、次の行がある場合はドラッグして改行をタブに置き換えます。
ビットにはs/\n/<tab>/
ここにリテラルタブが含まれていますが、一部のsはその場所でエスケープをサポートsed
することもできます。\t
再帰的なケースを処理するには、次のようにさらに強力にする必要があります。
sed '$!N;/^[[:alpha:]].*\n[^[:alpha:]]/s/\n/ /;P;D' <<\DATA
NAME_A
NAME_B
12,1
NAME_C
21,2
DATA
出力
NAME_A
NAME_B 12,1
NAME_C 21,2
常にデータセットの前に1行ずつ移動します。ご覧のように、2行が順番に表示される場合は、^[[:alpha:]]
改行文字を誤って置き換えません。
答え2
別の解決策:
sed -e :a -e '$!N;s/\n\([^[:alpha:]]\)/ \1/;ta' -e 'P;D'
現在の行が Alphabeta で始まらない場合は、現在の行が前の行に追加されます。
修正する
議論後、@mikerservが提案した解決策は次のとおりです。
sed ':a
/^[[:alpha:]]/{$!N;/\n[^[:alpha:]]/!ba;s/\(.*\)\n/\1\t/}
' file
説明する
アルファベット文字で始まる行から次の文字がある場合はドラッグし、改行文字の後にアルファベット以外の文字を指定できる場合は、最後の改行文字までパターンスペース内のすべての項目を選択します。その後、交換を実行します。最後の新しい行をタブ文字に変更します。しかし、そうでない場合は戻ってもう一度やり直してください。