如何使用 sed 在两个设置模式之间插入文本?

如何使用 sed 在两个设置模式之间插入文本?

我需要在一大组文件中的两个设置模式之间插入文本。
我需要用这种形式更改每一行:

<a href="/entry/someFile">

对此:

<a href="/entry/someFile.xhtml">

我一直在尝试编写一个sed命令来完成此任务,但我发现这非常困难。

我知道我需要使用href="/entry/and">作为分隔符,但我不明白如何使用sed更复杂的文本插入/替换。

编辑:我意识到我原来的帖子不清楚。不变的模式是href="/entry/">。 “someFile”可以是任何文件名。

答案1

有关sed解决方案,请参阅此答案的进一步内容。

假设节点是格式良好的 XML 文档的一部分,并且当现有值以 开头时,a您希望附加.xhtml到其标签的值:href/entry/

xml ed -u '//a[starts-with(@href, "/entry/")]/@href' \
       -x 'concat(../@href,".xhtml")' file.xml >file-new.xml

这使用XML小星(有时安装为xmlstarlet而不只是安装xml),它将找到相关a节点并附加到.xhtml它们的href属性,无论它们出现在文档中的哪个位置。

结果将保存到此处的新文件中,但xml ed --inplace ...在确保文件有效后,您可以在适当的位置编辑该文件。

测试:

$ cat file.xml
<?xml version="1.0"?>
<root>
  <a href="/entry/someFile1"/>
  <a href="/entry/someFile2"/>
  <a href="/entry/someFile3"/>
</root>

$ xml ed -u '//a[starts-with(@href, "/entry/")]/@href' -x 'concat(../@href,".xhtml")' file.xml
<?xml version="1.0"?>
<root>
  <a href="/entry/someFile1.xhtml"/>
  <a href="/entry/someFile2.xhtml"/>
  <a href="/entry/someFile3.xhtml"/>
</root>

使用sed(你会不是通常用于格式良好的 XML 文件):

sed 's|<a href="/entry/[^"]*|&.xhtml|g' file.xml

<a href="/entry/这与后跟任意数量的非字符的字符串匹配"(这将是文件名)。然后将整个匹配部分替换为自身和字符串.xhtml

使用sed -i,这将使修改到位。

测试(在与上面相同的文件上):

$ sed 's|<a href="/entry/[^"]*|&.xthml|g' file.xml
<?xml version="1.0"?>
<root>
  <a href="/entry/someFile1.xhtml"/>
  <a href="/entry/someFile2.xhtml"/>
  <a href="/entry/someFile3.xhtml"/>
</root>

答案2

sed 可能非常复杂,但根据您的需要,它很容易使用,请尝试:

sed -i 's/<a href=".*">/<a href="/some/link/">/g' yourfile.html

这里的语法很简单:

sed -i 's/stringt before replacing/string after replacing/g'

the.*是通配符,可以匹配任何内容,在需要的地方使用它

也许您应该在使用 sed 之前复制该文件。您的文件的更改-i不会创建新文件:

-i [SUFFIX], --in-place[=SUFFIX] 就地编辑文件(如果提供了 SUFFIX,则进行备份)

最后的替换g文件中的所有匹配项

如果您只想更改文件中的第一个匹配项,请使用:

sed -i '0,/<a href=".*">/{s/<a href=".*">/<a href="/some/link/">/}' yourfile.html

相同的语法:

sed -i '0,/string before/{s/string brefore/string after/}'

相关内容