sedを使用して設定された2つのパターンの間にテキストを挿入するには?

sedを使用して設定された2つのパターンの間にテキストを挿入するには?

大規模ファイルセットの2つの設定パターンの間にテキストを挿入する必要があります。
次の形式で各行を変更する必要があります。

<a href="/entry/someFile">

これに関して:

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

これを行うためにコマンドを作成しようとしましたが、sed非常に難しいです。

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

編集:私の元の投稿が不明であることを知っています。定数パターンhref="/entry/はとです">。 「someFile」はどんなファイル名でも構いません。

答え1

解決策についてsedは、この回答の詳細をご覧ください。

ノードが正しい形式のXML文書の一部であり、既存の値が次に始まるときにそのラベル値をa追加したいとします。.xhtmlhref/entry/

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

これは以下を使用します。XMLスター(時にはxmlstarlet単にinstallの代わりにインストールされます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>

答え2

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

関連情報