2016-02-24 49 views
0

我想顯示每行文本的第2和第7個字符。Bash切割鑽石問號符號

while read line 
do 
    x=`echo $line | cut -c2,7` 
    echo $x 
done 

樣品輸入:

C.B - Cantonment Board/Cantonment  
C.M.C â€「 City Municipal Council  
C.T â€「 Census Town  
E.O â€「 Estate Office 

預期輸出:

.C 
.â 
.「 
.「 

我的輸出:

.C 
.� 
.� 
.� 

任何人都知道爲什麼出現這種情況?

+3

你看上去分裂成編碼點代碼不全單位。我不認爲'cut'是UTF-8意識。 – Biffen

回答

1

cut並不真正支持Unicode。您可能需要使用Perl,而不是(改編自this Unix & Linux post):

perl -CIO -ne 'print substr($_, 1, 1) . substr($_, 6, 1) . "\n"' 

例如:

$ perl -CIO -ne 'print substr($_, 1, 1) . substr($_, 6, 1) . "\n"' < foo 
.C 
.â 
.「 
.「 

-CIO告訴perl是輸入和輸出都採用Unicode。 substr(var, m, n)提取從索引m(從0開始)開始的長度爲n的子串。所以第二個字符是索引1處的長度爲1的子字符串。$_是保存當前輸入行的變量。

1

您可以使用bash的子串參數擴展。

while read line; do 
    x=${line:1:1}${line:6:1} # 0-based counting 
    echo "$x" 
done <<EOF 
C.B - Cantonment Board/Cantonment 
C.M.C â€「 City Municipal Council 
C.T â€「 Census Town 
E.O â€「 Estate Office 
EOF 

形式${var:offset:length}返回length字符起始於的var值位置offset。字符串是0-索引的,就像數組一樣。

(我不知道,不過,如果bash總是處理UTF-8正確,或者如果它取決於它是如何被編譯。)

+1

我認爲這取決於語言環境。使用UTF-8語言環境,可以正確使用C語言環境,它的行爲與「剪切」相似。 – muru