web-dev-qa-db-ja.com

sedで2つのセットパターンの間にテキストを挿入するにはどうすればよいですか?

大きなファイルセットの2つのセットパターンの間にテキストを挿入する必要があります。
次のフォームですべての行を変更する必要があります:

<a href="/entry/someFile">

これに:

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

これを実現するためにsedコマンドを作成しようとしていますが、非常に難しいと感じています。

区切り文字としてhref="/entry/">を使用する必要があることは知っていますが、より複雑なテキストの挿入/置換にsedを使用する方法がわかりません。

編集:私は私の元の投稿で不明確だったことに気づきました。不変のパターンはhref="/entry/">です。 「someFile」は任意のファイル名にすることができます。

1
Daniel Sweet

sedソリューションについては、この回答のさらに下を参照してください。

aノードが整形式のXMLドキュメントの一部であり、既存の値が.xhtmlで始まる場合、それらのhrefタグの値に/entry/を追加するとします。

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

これは XMLStarletxmlstarletだけでなくxmlとしてインストールされることもあります)を使用し、関連するaノードを見つけて、ドキュメント内のどこにあるかに関係なく、.xhtmlhref属性に追加します。

結果はここで新しいファイルに保存されますが、機能することを確認したら、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>
1
Kusalananda

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/}'
0
Danloc