使用sed替换双引号字符之间的斜杠

时间:2012-07-07 21:25:46

标签: sed

在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 个答案:

答案 0 :(得分: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,即"..."
  • h在暂停空间(HS)中制作副本
  • s/[^"\n]*\(\n"[^"]*"\)[^"\n]*/\1/g删除其他所有内容
  • s/\//%20/g/替换为%20
  • H将修改后的替换添加到原始行
  • g用HS覆盖模式空间。
  • :a;s/\n"[^"]*"\(.*\n\)\n\("[^"]*"\)/\2\1/;ta一次一个用新的
  • 替换旧的
  • s/\n//删除\n使用时引入的H

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

答案 1 :(得分: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>