2014-01-24 46 views
1

在awk中使用gensub我發現我的大寫字母Z.沒有得到reckognised使用下列AWK行:AWK不使用正則表達式[0-Z]不能捕捉到z範圍

awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt 

上的文件「range2.txt 「有以下文字:

A 
B 
Z 

在Z上它只是返回Z而不是」succes「。如果不匹配,它將返回目標。但爲什麼它是無與倫比的?這讓我陷入循環,因爲我把我的問題與其他問題混淆了。我有一個解決方案來完成這項工作,但我仍然對此感到好奇。我嘗試了alfabet和數字的所有其他字母,這些字母都返回成功,但首字母大寫爲。但是,該字母或多或少處於該範圍的中間。

語言環境charmap返回了ISO-8859-15,其中Z在0-z範圍的中間。

我把這個問題歸結到我剛剛寫下來的內容,但沒有看到更多的開頭。我也使用了其他的AWK字符串函數,他們都沒有找到Z.即SPLIT MATCH GSUB。

我曾嘗試只是手動添加Z和然後它工作:

AWK「{名稱= gensub(/ [0-ZZ]/「更迭」, 「G」,$ 0);打印名}」 range2.txt

但仍...

+1

無法重現,它的工作對我來說...什麼環境,你在想什麼?你確定在任何地方都沒有任何奇怪的隱形角色/代碼就像你粘貼的一樣嗎? – Robin

+0

我在Linux 2.6.32上運行它,它爲我返回3個連續數,你的語言環境是什麼? mb你會嘗試像這樣做 awk'{name = gensub(/ [0-9a-zA-Z] /,「succes」,「g」,$ 0);打印名稱}'1.txt –

+0

我在redhat上:「紅帽企業Linux客戶端版本5.4(Tikanga)」(Linux 2.6.18-164.el5 x86_64)我的區域設置爲ISO-8859-15,但首都AZ會被分組在一起,我的範圍從0號降到了更低的z,它應該把所有的資本包起來。我知道解決方法,但我只是好奇爲什麼。我們離它近一步,因爲它不能被複制,因此似乎是一個設置或發行版問題。至於怪異的字符,沒有。嘗試在不同的文件。 –

回答

0

畢竟我現在可以自己回答這個問題了。

LC_all = C IS實際上正在工作,但它必須作爲環境變量導出。所以export LC_ALL=C(或更具體地說是LC_COLLATE)是我應該在我的控制檯中發佈的,而不僅僅是LC_ALL=C。後者可以使用,但只能在命令必須獨立於語言環境之後使用。

awk中應該是語言環境無關的,因爲第4版,但礦還在第3版。所以對我來說,我仍然要發出像AWK:

LC_ALL=C awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt 

LC_COLLATE=C awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt 

我的grep使用不同的語言環境。我無法找到設置這些語言環境的位置,這很有趣,但我確實看到了與字符範圍有關的不同行爲。另外,grep可以使它獨立於locale而受益。那麼,在我的設置:

echo Z | grep [0-z] 

回報什麼,下面就返回ž

LC_ALL echo Z | grep [0-z] 
1

唯一可能的答案是,Z是不是在現場指定範圍內。您的發言區可能會被破壞。嘗試使用其他工具,如grep和sed,使用相同的範圍來查看是否可以重現問題 - 如果問題出在您的語言環境上,那麼問題與您的語言環境有關,如果不是,則使用awk。

+0

還有更多值得思考的食物。剛剛嘗試過'grep'[0-z]'range2.txt',這讓我連A和B都沒有,反而沒有任何東西。這讓我想到了你提到的訂單。現在看來Grep使用表格順序0-9a-zA-Z。 Awk使用表格順序0-9aAbB..zZ(並且對於缺失的Z有答案,[0-Z]給出所有成功的答案)。最後,我的locale ISO-8859-15根據維基百科定義爲0-9A-Za-z。所以**所有**都是不同的。所以表格順序來自哪裏仍然朦朧。 –

+0

*我可能會將此作爲回答發佈,除非有人能夠看到這些訂單的定義位置。 –

+0

''[[:alnum:]]'給你'grep'和'awk'?這就是我們總是告訴人們使用而不是明確的範圍來避免區域設置問題,所以我很好奇,如果它在你顯然嚴重破壞的環境中適用於你。在一天結束的時候,老實說,如果角色班級工作時你不應該使用範圍,那麼就很難關心爲什麼某個特定角色不在某個範圍內。 –