大きなファイルセットの2つのセットパターンの間にテキストを挿入する必要があります。
次のフォームですべての行を変更する必要があります:
<a href="/entry/someFile">
これに:
<a href="/entry/someFile.xhtml">
これを実現するためにsed
コマンドを作成しようとしていますが、非常に難しいと感じています。
区切り文字としてhref="/entry/
と">
を使用する必要があることは知っていますが、より複雑なテキストの挿入/置換にsed
を使用する方法がわかりません。
編集:私は私の元の投稿で不明確だったことに気づきました。不変のパターンはhref="/entry/
と">
です。 「someFile」は任意のファイル名にすることができます。
sed
ソリューションについては、この回答のさらに下を参照してください。
a
ノードが整形式のXMLドキュメントの一部であり、既存の値が.xhtml
で始まる場合、それらのhref
タグの値に/entry/
を追加するとします。
xml ed -u '//a[starts-with(@href, "/entry/")]/@href' \
-x 'concat(../@href,".xhtml")' file.xml >file-new.xml
これは XMLStarlet (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>
sedは非常に複雑になる可能性がありますが、ニーズに合わせて簡単に試してみてください。
sed -i 's/<a href=".*">/<a href="/some/link/">/g' yourfile.html
ここでの構文は簡単です。
sed -i 's/stringt before replacing/string after replacing/g'
.*
ワイルドカードは、必要な場所で使用するものと一致します
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/}'