gpt4 book ai didi

linux - 我可以将多行模式与 sed 匹配吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:08 24 4
gpt4 key购买 nike

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

<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

关于linux - 我可以将多行模式与 sed 匹配吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com