2017-09-04 218 views
0

下面的代碼工作:AWK gensub正則表達式反斜槓0和反斜槓1不靈

// { 
print gensub("[a-z][A-Z]」,"&","g") 
} 

但這並不:

// { 
print gensub("[a-z][A-Z]","\0","g") 
} 

而且也不該是最後我想要達到的目標:

// { 
print gensub(「([a-z])([A-Z])",」\1 \2","g") 
} 

爲什麼這不起作用,我該如何使這項工作。這個劇本的目的:名字是用不用空格分隔的姓氏給出的,我需要把它們分開。名字的第一個字母是大寫字母,我不想在第一個名字之前留出空格。我可以將FS設置爲''並檢查每個字符,但我想學習gensub。我也沒有找到gsub的用法,因爲它給我的是匹配的數量,而不是替換後的字符串。

另一種可能的解決方案,但我不知道如何使這項工作是將gensub中的目標從"g"設置爲"2,3,4"等等,但我無法在這裏提供一個以上的參數。

請不要建議替代解決方案只是如何使上述工作的一個

回答

0

您使用「智能引號」(),而不是在地方實際報價("),和awk反向引用是\\1等,而不僅僅是\1。第一個參數gensub是一個正則表達式不是字符串,所以使用正則表達式分隔符/.../而不是字符串分隔符"..."(後者會導致雙重解析,這會產生負面影響 - 請參見手冊頁)。擺脫//,因爲他們絕對不會干擾你的代碼。最後 - 爲了便攜性和健壯性,使用字符類[[:lower:]][[:upper:]]而不是範圍[a-z][A-Z]

$ echo 'EdMorton' | awk '{print gensub(/([[:lower:]])([[:upper:]])/,"\\1 \\2",1)}' 
Ed Morton 
+0

如何更改智能報價和真實報價?你是如何認識諸如\\而不是\?的東西的? –

+0

idk人們如何創造「聰明的引號」(我從你的問題複製/粘貼),但我認爲這是有關使用一些編輯器(可能是Windows的?),所以也許找到一個不同的編輯器(我使用' vi')?同樣,我也瞭解其他一切 - 閱讀文檔和經驗。 FWIW我強烈推薦Arnold Robbins編寫的Effective Awk Programming第4版 - 如果你有任何其他的awk書,那麼就把它扔掉。 –

+0

也是關於向gensub提供超過1個目標的問題。你能解決這個問題嗎?我不知道你在說什麼要擺脫//?我的代碼在沒有它們的情況下工 –