2016-02-24 3 views
0

Я пытаюсь отобразить 2-й и 7-й символы из каждой строки текста.Bash Cut diamond знак вопроса знак

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

Похоже, вы разделив кодовые Into неполных кодовых единиц. Я не думаю, что '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) извлекает подстроку длиной n, начиная с индекса m (начиная с 0). Таким образом, второй символ является подстрокой длины 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 символов, начиная с позиции offset в значении var. Строки имеют 0-индекс, например массивы.

(я не уверен, хотя, если bashвсегда обрабатывает UTF-8 правильно, или если это зависит от того, как она была составлена.)

+1

Я думаю, что это зависит от локали. В локали UTF-8 это работает правильно, с языковой версией C он ведет себя как 'cut'. – muru

Смежные вопросы