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命令组合在一起?

4

2 回答 2

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/用's替换' %20s
  • H将修改后的替换附加到原始行
  • g用 HS 覆盖模式空间。
  • :a;s/\n"[^"]*"\(.*\n\)\n\("[^"]*"\)/\2\1/;ta一次一个地用新的替换旧的
  • s/\n//删除使用时\n引入的H

尝试插入l0上述解决方案以查看模式空间中的内容。

于 2012-07-07T22:35:50.480 回答
0

只是为了品种,这里有一个解决方案awk。您可以将它们全部放在一行上:

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 回答