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

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

我有一个与此类似的文本文件:

A
B
C
D
E
F
G

我需要:

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

这是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一般来说,像这样的情况用or可以更明显地完成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 的建议更改了操作顺序,以使示例更加通用(处理X1Y1插入的行可能与/D//F/模式匹配的情况)。

相关内容