問題は、コマンド全体を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
の引数として提供する必要があります。sed
sed
おすすめ:
# 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>|'
^^^^^^^^^^^^^
sed
OPパイプラインの更新版を実行すると、次のようになります。
<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>