1

假设我在一个文件中有这个模式:

<directory number=133 name=var1> 
<myfile name=test1 /> 
</directory>

现在我想用

<directory number=133 myfile=test1 />

我该怎么做sed

4

1 回答 1

2

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
于 2013-01-07T07:43:23.577 回答