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