在多命令 sed 文件中将一行移到另一行之前

Gio*_*ato 2 sed

.

我有一个类似这样的文本文件:

A
B
C
D
E
F
G
Run Code Online (Sandbox Code Playgroud)

我需要:

  1. 在行E前移动行C
  2. CXX可以是多行)替换行;
  3. GYY可以是多行)替换行;
  4. 删除行DF

这是sed我现在拥有的文件:

/C/ c\
X
/G/ c\
Y
/D/ d
/F/ d
Run Code Online (Sandbox Code Playgroud)

哪个是 2, 3, 4 但不是 1. 我怎样才能修复脚本E之前移动C

注意:我不能依赖行号或行的连续性,它们可能会有所不同;我只能依靠模式匹配。

mos*_*svy 5

对于您的特定情况,这将执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

比我更聪明的人可能能够以更简单的方式做到这一点 - 请注意,这应该处理DC和之间存在其他线的情况E。然而,这假设A, B, ... 行已排序,即没有GC和之间D

通常,使用edor更明显地完成这样的情况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
Run Code Online (Sandbox Code Playgroud)

/PAT1/m/PAT2/-1命令将在行匹配PAT1之前移动匹配的行PAT2

/PAT/c命令会将匹配行更改为PAT以下以..

g/PAT/d命令将转到所有匹配的行PAT并删除它们。

我已经根据@don_crissti 的建议更改了操作顺序,以使示例更通用(处理X1,Y1插入的行可能与/D//F/模式匹配的情况)。