sed インラインでは XML スタイルの入力を変更できません

sed インラインでは XML スタイルの入力を変更できません

問題は、コマンド全体をSEDと同じ行に入れることができないことです。そうしましたが、次のファイルでは機能しません。私の例:

<file>Documents/time/text1</file> //2X slash + 2 words to remove !!
<file>Commun/text2</file>         //1X slash to remove + 1 words to remove
<file>Current/text3</file>        //1X slash to remove + 1 words to remove

このコードがオンラインで機能しないのはなぜですか?

sed 's/Documents//g' | sed 's/time//g' | sed 's/Commun//g' | sed 's/Current//g' | sed 's/Current//g' | sed '/<file>/s|<file>/|<file>|' | sed '/<file>/s|<file>/|<file>|' tracklist.txt > newtracklist.txt

ベストアンサー1

OPの現在のスクリプトパイプラインを実行すると、入力ファイル()の内容がstdoutとして印刷され、パイプラインが中断されsedますtracklist.txt(つまり、他の出力がないか、コマンドプロンプトに戻りません)。はい推測するOPが言及したときに言及した内容です。it does not work...??

主な問題:入力ファイル()は、最後のスクリプトではなく最初のスクリプトtracklist.txtの引数として提供する必要があります。sedsed

おすすめ:

# instead of this:

sed 's/Documents//g'               | ... |  sed '/<file>/s|<file>/|<file>|' tracklist.txt
                                                                            ^^^^^^^^^^^^^
# do this:

sed 's/Documents//g' tracklist.txt | ... |  sed '/<file>/s|<file>/|<file>|'
                     ^^^^^^^^^^^^^

sedOPパイプラインの更新版を実行すると、次のようになります。

<file>text1</file>
<file>text2</file>
<file>text3</file>

HTML / XMLを解析するためのより良いツールがありますが、OPがそれを使用する必要がある場合は、よりsed効率的な方法で同じ結果を生成することができます。

アイデアにはsedスクリプトが必要です。

sed -E 's|(<file>).*/([^/]+</file>)|\1\2|' tracklist.txt

どこ:

  • -E- 拡張正規表現サポートの有効化
  • (<file>)- (最初のキャプチャグループ)文字列と一致します。<file>
  • ([^/]+</file>)- (2番目のキャプチャグループ)/の後に文字列がないすべての文字と一致します。</file>
  • .*/- 2つのキャプチャグループ間のすべてが/
  • \1\2- 代替文字列は、一緒に追加された2つのキャプチャグループで構成されています。
  • メモ:これは、OPが提供する特定の入力に対して機能します。入力がOPの入力例に示されている形式と異なる形式の場合は、調整が必要になる場合があります。

OPのサンプル入力の場合、以下が生成される。

<file>text1</file>
<file>text2</file>
<file>text3</file>

おすすめ記事