2017-08-27 12 views
1

htmlファイルからsedを使用してファイル名以外のディレクトリパスを削除します。パスは次のようになります。エコーでsedを使用し、ファイルから読み取る

<a href="/dir1/dir2/file.mp3" other_tags_here </a> 

ディレクトリとファイル名には、スペース(%)と他の文字が含まれています。例えば。

<a href="/1-%one%2026/two%20_three%four/1-%eight.mp3" 

私はちょうど<a href="1-%eight.mp3" other_tags_here <a/>を保つ必要があります。試してみると

echo '<a href=/1-%one%2026/two%20_three%four/1-%eight.mp3' | sed 's|href="/.*/.*/|href="|g' 

うまくいきます。私はhtmlファイル

sed 's|href="/.*/.*/|href="|g' file.html 

から読んだときしかし、それはhref=後にすべてのものを削除し、のみhref=返します。これを修正するにはどうすればよいですか?

答えて

2

sedでは、正規表現は一番長い最長一致と一致します。つまり、正規表現内の最後の.*/は、その行の最後の/に一致します。その防止のため:

sed 's|href="/[^/]*/[^/]*/|href="|g' file.html 

を正規表現[^/]*/は次の/に一致します。

pythonやperlなどの言語では、非貪欲な正規表現を使用してこの問題に対処できます。 sedは非貪欲な正規表現をサポートしていないので、[^/]*/のようなトリックを使って同様の効果を達成しようとする必要があります。

標準警告:一般的に、html形式は、正規表現が扱いに適さない特殊なケースがたくさんあり、非常に複雑になることがあります。 htmlで作業する場合は、一般に、html固有のツール(pythonのbeautifulsoupなど)を使用するのが最善です。

関連する問題