2012-07-07 151 views
1

在HTML文件中,我試圖替換出現在一對雙引號"%20之間的斜槓/。 例如,而不是有這樣一行:使用sed替換雙引號字符之間的斜槓

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

我想:

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

我試圖使用sed命令是這樣的:

sed -e 's/\(^.*href=\"\).*\(\".*\)/\[email protected]@@\2/g' 

但是相反'@@@',我試圖用另一個sed命令替換/%20

's/\//%20/g' 

是否可以將這兩個sed命令組合在一起?

+0

我沒有看到在這兩個例子來支持你想用我來比較的任何差異/ AM /開心。你能否重申它們? – DrinkJavaCodeJava 2012-07-07 21:28:45

+0

雖然它可能可以在'sed'完成,我不認爲它是適合的工具工作;這太像辛勤工作和扭曲的想法。使用Python或Perl或其他您選擇的腳本語言。 – 2012-07-07 21:53:49

回答

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全球每一個打算串即"..."
  • h前插入\n進行復印在保持空間(HS)
  • s/[^"\n]*\(\n"[^"]*"\)[^"\n]*/\1/g刪除所有其他
  • s/\//%20/g'由%20小號的
  • H經修正的替代追加到原線
  • g覆蓋與HS模式空間替換/
  • :a;s/\n"[^"]*"\(.*\n\)\n\("[^"]*"\)/\2\1/;ta一次一個替換舊與新
  • s/\n//刪除推出\nH使用

嘗試在上述方案將l0看到什麼是模式空間。

+0

你能解釋它是如何工作的嗎? – 2012-07-07 22:41:23

+0

酷!你能幫我理解這條線嗎? – Esty 2012-07-07 22:49:56

+0

通過查看在['sed的(1)'](http://unixhelp.ed.ac.uk/CGI/man-cgi?sed) – 2012-07-07 23:14:09

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>