假设我在一个文件中有这个模式:
<directory number=133 name=var1>
<myfile name=test1 />
</directory>
现在我想用
<directory number=133 myfile=test1 />
我该怎么做sed
?
Sed 不适合多行的东西,但是:
sed ':l;N;$!tl;N;s!<directory number=133 name=var1>[ ]*\n<myfile name=test1 />[ ]*\n</directory>!<directory numbe=133 myfile=test1 />!' input
此命令首先循环读取所有文件:
:l;N;$!tl;N; # label l, read line, while not eof jump to label l
:l
标签在哪里。N
是读取下一行并将其附加到缓冲区命令。$!
测试是否 ( !
) 文件结尾 ( $
)。t
是最后一次测试成功命令的分支。t
后跟要分支到的标签名称,因此tl
. 最后N
一行在继续之前将最后一行附加到缓冲区。
然后基本上匹配问题中的输入,并使用替换 ( s!regex!replace!
) 命令将其替换为所需的输出。
如果您还想捕获所有不同的数字和名称:
sed ':l;N;$!tl;N;s!<directory number=\([0-9]*\) name=\([^>]*\)>[ ]*\n<myfile name=test1 />[ ]*\n</directory>!<directory number=\1 myfile=\2 />!' input