.
我有一个类似这样的文本文件:
A
B
C
D
E
F
G
Run Code Online (Sandbox Code Playgroud)
我需要:
E
前移动行C
;C
用X
(X
可以是多行)替换行;G
用Y
(Y
可以是多行)替换行;D
和F
。这是sed
我现在拥有的文件:
/C/ c\
X
/G/ c\
Y
/D/ d
/F/ d
Run Code Online (Sandbox Code Playgroud)
哪个是 2, 3, 4 但不是 1. 我怎样才能修复脚本E
之前移动C
?
注意:我不能依赖行号或行的连续性,它们可能会有所不同;我只能依靠模式匹配。
对于您的特定情况,这将执行以下操作:
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)
比我更聪明的人可能能够以更简单的方式做到这一点 - 请注意,这应该处理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
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/
模式匹配的情况)。