sed
私はLinuxを使用していますが、これを使用して2つのタグ間のスラッシュ()を削除したいと思います。/
したがって:
<file>/text</file>
<file>/text2</file
<file>/text</file>..
これに関して
<file>text</file>
<file>text2</file
<file>text</file>..
成功事例なしで多くのコードをテストしました。
sed s'/<file>/s|^\.{1,2}/||' fileout
助けてください?
ベストアンサー1
次の正しい形式のXMLファイルが提供されます。
<?xml version="1.0"?>
<root>
<file>/text</file>
<file>/text2</file>
<file>/text</file>
<file>other text</file>
</root>
file
...値が次から始まる場合は、XMLStarletを使用して各ノード値の最初の文字を削除できます/
。
xmlstarlet edit \
--update '//file[starts-with(text(), "/")]' \
--expr 'substring(text(), 2)' \
myfile.xml
または、より短い構文を使用すると、
xmlstarlet ed \
-u '//file[starts-with(text(), "/")]' \
-x 'substring(text(), 2)' \
myfile.xml
file
次に、入力文書全体で値がで始まるすべてのノードを見つけて、を使用して/
最初の文字を削除しますsubstring()
。
結果:
<?xml version="1.0"?>
<root>
<file>text</file>
<file>text2</file>
<file>text</file>
<file>other text</file>
</root>
これ(そして以下のもの)は、値に改行を含むノードを処理します。
初めてだけでなく、値のどこでも検出したいですか/
?すべてを削除するには、代わりに次のものを使用できcontains()
ますtranslate()
。
xmlstarlet edit \
--update '//file[contains(text(), "/")]' \
--expr 'translate(text(), "/", "")' \
myfile.xml
または単に(translate()
値がない場合、呼び出しは値を変更せずに残します)/
xmlstarlet edit \
--update '//file' \
--expr 'translate(text(), "/", "")' \
myfile.xml
次の入力ファイルが与えられた場合:
<?xml version="1.0"?>
<root>
<file>text/</file>
<file>/text/2</file>
<file>te/x/t/</file>
<file>other text</file>
</root>
...上記のコマンドは、次の結果を生成します。
<?xml version="1.0"?>
<root>
<file>text</file>
<file>text2</file>
<file>text</file>
<file>other text</file>
</root>