。
次のようなテキストファイルがあります。
A
B
C
D
E
F
G
以下を行う必要があります。
E
行を行の前に移動するC
。C
行を次のように置き換えますX
(X
複数行にすることができます)。G
行を次のように置き換えますY
(Y
複数行にすることができます)。- 行を削除
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
。しかし、これは、、、...行がソートされていると仮定します。つまり、との間に何もありません。C
E
A
B
G
C
D
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
移動します。PAT1
PAT2
このコマンドは、一致する行をで終わる次の行に/PAT/c
変更します。PAT
.
このg/PAT/d
コマンドは、一致するすべての行に移動してPAT
削除します。
例をより一般的にするために、@don_crisstiの提案に従って作業順序を変更しました(挿入された行がパターンに一致するX1
場合は処理)。Y1
/D/
/F/