![在多命令 sed 文件中将一行移到另一行之前](https://linux22.com/image/140903/%E5%9C%A8%E5%A4%9A%E5%91%BD%E4%BB%A4%20sed%20%E6%96%87%E4%BB%B6%E4%B8%AD%E5%B0%86%E4%B8%80%E8%A1%8C%E7%A7%BB%E5%88%B0%E5%8F%A6%E4%B8%80%E8%A1%8C%E4%B9%8B%E5%89%8D.png)
。
我有一个与此类似的文本文件:
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
一般来说,像这样的情况用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 的建议更改了操作顺序,以使示例更加通用(处理X1
、Y1
插入的行可能与/D/
或/F/
模式匹配的情况)。