我需要在一大组文件中的两个设置模式之间插入文本。
我需要用这种形式更改每一行:
<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/}'