2015-05-12 95 views
0

請考慮awk中的以下替換。是否有可能使用awk的gsub函數的替代分隔符?

echo 'hello/bar/goo' | awk '{gsub(/\//,"foo"); print}' 

輸出結果如下。

hellofoobarfoogoo 

觀察到,我們在第一個參數逃脫/gsub因爲/是正則表達式中awk的gsub功能默認的分隔符。

考慮到我們可以通過改變分隔符來解決sed中的同樣問題,我想知道gsub是否可以實現。

echo 'hello/bar/goo' | sed 's!/!foo!g' 

我已經嘗試了以下兩種方法,但它們會導致語法錯誤。

echo 'hello/bar/goo' | awk '{gsub(!/!,"foo"); print}'                           
awk: cmd. line:1: {gsub(!/!,"foo"); print} 
awk: cmd. line:1:  ^unterminated regexp 
awk: cmd. line:2: {gsub(!/!,"foo"); print} 
awk: cmd. line:2:      ^unexpected newline or end of string 

echo 'hello/bar/goo' | awk '{gsub(|/|,"foo"); print}' 
awk: cmd. line:1: {gsub(|/|,"foo"); print} 
awk: cmd. line:1:  ^syntax error 
awk: cmd. line:1: {gsub(|/|,"foo"); print} 
awk: cmd. line:1:  ^unterminated regexp 

是有一些選擇,我可以在awk設置爲允許備用分隔符爲gsub

如果是這樣,那麼允許的備用分隔符集合是什麼?

回答

1

您可以使用雙引號作爲分隔符。

echo 'hello/bar/goo' | awk '{gsub("/","foo"); print}' 

但隨着反斜線打交道時,因爲你需要,爲了匹配一個反斜槓使用四個反斜槓小心。

$ echo 'hello/bar\goo' | awk '{gsub("\\\\","foo"); print}' 
hello/barfoogoo 
+0

我會接受這個答案,因爲它肯定能解決我的問題。然而,只是好奇,這是唯一的替代分隔符? (我注意到我連接的手冊甚至沒有提到這個。) – merlin2011

+0

就是這樣。如果你需要備用分隔符和更高級的語言,可以看一下Perl。有工具's2p'和'a2p'將'sed'和Awk腳本轉換爲Perl腳本。 (這些說,也許你也應該考慮Python和/或Ruby。) – tripleee

+1

@ merlin2011 - 要清楚,'/'是awk支持的**只有**正則表達式分隔符。然而,你可以在正則表達式上下文中使用變量或字符串,然後在使用它之前,awk會將其轉換爲正則表達式。因此,當你在正則表達式上下文中看到''foo''時,''s不是正則表達式分隔符,它們是字符串分隔符,而awk正在將字符串轉換爲正則表達式,因爲字符串正被使用的上下文(例如第一個參考'gsub()'。試試'echo'x'| awk'/ foo /''和echo'x'| awk'「foo」'',你會發現'''不是一個正則表達式分隔符,查看靜態與動態正則表達式。 –

0

只有在awk分隔符正則表達式是/,但可以作爲阿維納什顯示,搜索字符串"something"。沒有其他選擇可能。

相關問題