SED コマンドは、2 つのタグ間のスラッシュ「/」を削除します。

SED コマンドは、2 つのタグ間のスラッシュ「/」を削除します。

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>

おすすめ記事