複数コマンドの sed ファイル内の 1 行を別の行の前に移動

複数コマンドの sed ファイル内の 1 行を別の行の前に移動

次のようなテキストファイルがあります。

A
B
C
D
E
F
G

以下を行う必要があります。

  1. E行を行の前に移動するC
  2. C行を次のように置き換えますXX複数行にすることができます)。
  3. G行を次のように置き換えますYY複数行にすることができます)。
  4. 行を削除DしますF

これはsed私が今持っているファイルです:

/C/ c\
X
/G/ c\
Y
/D/ d
/F/ d

2、3、4 は実行されますが、1 は実行されません。E以前に移動するようにスクリプトを変更するにはどうすればよいですかC

注:行番号または行連続性は信頼できず、パターン一致にのみ依存する可能性があります。

答え1

特定のケースでは、次のようにします。

sed '
/C/,/E/ {
        s/[CD]/&/
        t s
        s/E.*/&\
X1\
X2/
        t e
        H
        :s
        d
        :e
        p
        x
        D
}
/F/d
/G/c\
Y1\
Y2
' file

私よりもスマートな人なら、もっと簡単な方法でこれを行うことができますD。しかし、これは、、、...行がソートされていると仮定します。つまり、との間に何もありません。CEABGCD

ed通常、このような状況は以下を使用してより明確に実行できますex

$ ed <<'EOT' -s file
/E/m/C/-1
g/D/d
g/F/d
/C/c
X1
X2
.
/G/c
Y1
Y2
.
w
EOT

$ cat file
A
B
E
X1
X2
Y1
Y2

このコマンドは、一致する行を一致する行の前に/PAT1/m/PAT2/-1移動します。PAT1PAT2

このコマンドは、一致する行をで終わる次の行に/PAT/c変更します。PAT.

このg/PAT/dコマンドは、一致するすべての行に移動してPAT削除します。

例をより一般的にするために、@don_crisstiの提案に従って作業順序を変更しました(挿入された行がパターンに一致するX1場合は処理)。Y1/D//F/

関連情報