2011-04-06 151 views
2

我想寫一個awk條件來匹配一個字符串,如果它以大寫字母開頭的話。這是一個示例數據文件。AWK忽略字符類中的大小寫

a 
b 
c 
A 
B 
C 
d 
e 

比方說,我想匹配所有匹配字符ABC的行。

awk '{ if ($1 ~ /^[ABC]/) print }' test 
A 
B 
C 

夠簡單。但是,如果我使用角色類,這不起作用。案例被忽略。

awk '{ if ($1 ~ /^[A-C]/) print }' test 
b 
c 
A 
B 
C 

有趣的是這個工程:

awk '{ if ($0 ~ /^[[:upper:]]/) print }' < test 
A 
B 
C 

從文檔,我希望的命令是:

awk '{ if ($0 ~ /^[:upper:]/) print }' < test 

我是什麼誤會?具體而言,爲什麼[A-C]不區分大小寫,爲什麼我需要編寫[[:upper:]]而不是[:upper:]

echo $LANG 
en_US.utf8 
+0

我看不到你的結果。你的'LANG'環境變量持有什麼? – 2011-04-06 17:13:37

+0

從gawk手冊頁:字符類只在字符列表的 括號內的正則表達式中有效。 – 2011-04-06 17:15:05

+0

我可能明白你在說什麼。我需要'[[A-C]]'? 'awk'{if($ 0〜/^[[A-C]] /)print}'test'給出0個結果。 gawk也一樣。 – schmmd 2011-04-06 18:48:10

回答

2

我誤解了什麼? 具體來說,爲什麼是[A-C]的情況下 不敏感

這可能與您的語言環境,這可能影響字符類範圍內的事情。

嘗試用[A-C]

重新設置export LC_ALL=C然後運行你的awk命令,爲什麼我需要寫[[:上:]的 而非[:上:]?

[:upper:]基本上是寫範圍A-Z的語言環境不敏感的方式,但你也希望這是一個字符類,所以你把它包在[],因此[[:upper:]]。例如,如果你想匹配所有大寫字母和數字,你會寫[[:upper:][:digit:]]

+0

這很好理解(re:[:upper:]),但你能解釋爲什麼'awk'{if($ 0〜/^[:upper:] /)print}' schmmd 2011-04-06 18:45:00

+0

是的,這是當地的問題。 'export LC_ALL = C'表示預期的輸出。謝謝你的提示! – schmmd 2011-04-06 18:50:24

+2

@schmid,這個[[:upper:]'和這個'[epru:]'完全一樣 - 括號包含你想要匹配的一組字符。 – 2011-04-06 18:55:16