大規模ファイルセットの2つの設定パターンの間にテキストを挿入する必要があります。
次の形式で各行を変更する必要があります。
<a href="/entry/someFile">
これに関して:
<a href="/entry/someFile.xhtml">
これを行うためにコマンドを作成しようとしましたが、sed
非常に難しいです。
href="/entry/
と区切り文字を使用する必要があることを知っていますが、より複雑なテキストの挿入/代替の">
使用方法を理解していません。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
単にinstallの代わりにインストールされます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'
ワイルド.*
カードであり、何でも一致できます。必要に応じて使用してください。
おそらく、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/}'