1

/HTMLファイルで、二重引用符のペアの間に表示されるスラッシュを"。に置き換えようとしています%20。たとえば、次の行を使用する代わりに、次のようにします。

<a href="i/love/unix">i/am/happy!</a>

私は手に入れたい:

<a href="i%20love%20unix">i/am/happy!</a>

私は次のsedようなコマンドを使用しようとしています:

sed -e 's/\(^.*href=\"\).*\(\".*\)/\1@@@\2/g'

しかし、「@@@」の代わりに、別のsedコマンドを使用/して%20:に置き換えようとしています。

's/\//%20/g'

sedこれらの2つのコマンドを組み合わせることができますか?

4

2 に答える 2

0

多様性のためだけに、ここにソリューションがありawkます。すべてを 1 行にまとめることができます。

bash$ echo '<a href="i/love/unix">i/am/happy!</a>' |
   awk -v FS='"' -v OFS='"' '{ for (i=2; i<NF; i+=2) { gsub("/", "%20", $i); } print }'
<a href="i%20love%20unix">i/am/happy</a>

複数行の方が読みやすいと思います:

bash$ echo '<a href="i/love/unix">i/am/happy!</a>' | awk -F \" -v OFS=\" '{
>   for (i=2; i<NF; i+=2) {
>      gsub("/", "%20", $i)
>   }
>   print
> }'
<a href="i%20love%20unix">i/am/happy</a>
于 2012-07-07T23:43:17.443 に答える
0

これはうまくいくかもしれません(GNU sed):

echo '<a href="i/love/unix">i/am/happy!</a>' |
sed 's/"[^"]*"/\n&/g;h;s/[^"\n]*\(\n"[^"]*"\)[^"\n]*/\1/g;s/\//%20/g;H;g;:a;s/\n"[^"]*"\(.*\n\)\n\("[^"]*"\)/\2\1/;ta;s/\n//'
<a href="i%20love%20unix">i/am/happy!</a>

説明:

  • s/"[^"]*"/\n&/g\n意図した各文字列の前にa をグローバルに挿入します。"..."
  • hホールド スペース (HS) にコピーを作成する
  • s/[^"\n]*\(\n"[^"]*"\)[^"\n]*/\1/g他のすべてを削除します
  • s/\//%20/gをに置き換え/ます%20
  • H修正された置換を元の行に追加します
  • gパターンスペースを HS で上書きします。
  • :a;s/\n"[^"]*"\(.*\n\)\n\("[^"]*"\)/\2\1/;ta1 つずつ古いものを新しいものに置き換えます
  • s/\n//が使用さ\nれたときに導入された を削除しますH

l0上記のソリューションに挿入して、パターン空間に何があるかを確認してください。

于 2012-07-07T22:35:50.480 に答える