0

ファイルのどこかで改行に出くわした場合を除いて、正常に動作する sed コマンドがあります。これが私のコマンドです:

sed -i 's,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g'

今、それは完全に機能しますが、次のaようなタグを持つこのファイルに出くわしました:

<a href="link">Click
        here now</a>

もちろん、これは見つかりませんでした。そのため、検索で改行を許可するように何らかの方法で変更する必要があります。しかし、最初にファイル全体を調べて、すべてを事前に削除しない限り、それを許可する方法がわかりません\n。問題があるのは、ファイル内のすべてのフォーマットが失われていることです。

4

2 に答える 2

2

これを行うには、sed スクリプトにループを挿入します。

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile

そのままでは、出力に改行が埋め込まれたままになり、そのようにしたいかどうかは明確ではありませんでした。そうでない場合は、改行を置き換えてください。

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s/\n//g;s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile

そして多分余分なスペースをクリーンアップします:

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s/\n//g;s/\s\{2,\}/ /g;s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile

説明:/<a href/{...}は、気にしない行を無視できるようにします。気に入ったものが見つかったら、エンド マーカーがあるかどうかを確認します。そうでない場合 ( /<\a>/!)、次の行と改行 (N) を取得し、分岐 (b) して :next に戻り、まだ見つかっているかどうかを確認します。それが見つかったら、置換を続行します。

于 2013-04-05T22:45:49.880 に答える
0

これは、リンクに改行が1つしかないことを前提とした、手早く汚い解決策です。

sed -i '' -e '/<a href=.*>/{/<\/a>/!{N;s|\n||;};}' -e 's,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g'

最初のコマンド ( ) は、 without/<a href=.*>/{/<\/a>/!{N;s|\n||;};}の存在をチェックします。存在する場合は、次の行をパターン スペースに読み込み、改行を削除します。2番目はあなたのものです。<a href=...></a>

于 2013-04-05T22:46:01.497 に答える