請考慮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
?
如果是這樣,那麼允許的備用分隔符集合是什麼?
我會接受這個答案,因爲它肯定能解決我的問題。然而,只是好奇,這是唯一的替代分隔符? (我注意到我連接的手冊甚至沒有提到這個。) – merlin2011
就是這樣。如果你需要備用分隔符和更高級的語言,可以看一下Perl。有工具's2p'和'a2p'將'sed'和Awk腳本轉換爲Perl腳本。 (這些說,也許你也應該考慮Python和/或Ruby。) – tripleee
@ merlin2011 - 要清楚,'/'是awk支持的**只有**正則表達式分隔符。然而,你可以在正則表達式上下文中使用變量或字符串,然後在使用它之前,awk會將其轉換爲正則表達式。因此,當你在正則表達式上下文中看到''foo''時,''s不是正則表達式分隔符,它們是字符串分隔符,而awk正在將字符串轉換爲正則表達式,因爲字符串正被使用的上下文(例如第一個參考'gsub()'。試試'echo'x'| awk'/ foo /''和echo'x'| awk'「foo」'',你會發現'''不是一個正則表達式分隔符,查看靜態與動態正則表達式。 –