2015-07-06 5 views
4

Проблема:Как узнать, является ли символ возвратом каретки?

Я всегда был в состоянии во время цикла через символы, чтобы определить символ, я хочу. Однако теперь, когда я хочу, чтобы определить, возврат каретки, мой способ делать вещи, кажется, не работает:

function removeCarriageReturn() 
{ 
    word="" 

    while IFS= read -r -n1 char ; do 
    if [ "${char}" != "\r" ] ; then 
     word="${word}${char}" 
    fi 
    done <<<"$1" 

    printf '%s\n' "$word" 
} 

Результат:

По причине я не знаю, это добавляет почему-то «$» перед возвратом кареты? Вот результат (от Jenkins):

Когда символ анализируют, например, 8

++ '[' 8 '!=' '\r' ']' 

Когда символ анализируемый \ R

++ '[' $'\r' '!=' '\r' ']' 

ответ

4

Обходя свой актуальный вопрос, самый простой способ, чтобы удалить все символы возврата каретки из значения является

value=${value//$'\r'} 

(который также показывает, что Ваше if заявление будет читать

if [ "$char" != $'\r' ]; then. 

Обратите внимание, что это является тот же синтаксис, что и для отображения возврата каретки используется -x.)

+1

Это снимает только с конца. Цикл OPs удаляется в любом месте. –

+0

Я пропустил это. Закрепление. – chepner

+0

отметит это как ответ, спасибо! Ваш первый вариант, удаляет ли он все экземпляры? – Cher

5

$'' со ссылкой на это ANSI-C quoting и он интерпретирует некоторые escape-последовательности.

Ничто не будучи добавил там просто set -x показывая вам, что это на самом деле происходит. У вас нет двухсимвольной строки "\r", у вас есть буквал \r и вот что такое $'\r'.

Этот факт (и вывод set -x) также расскажет вам, как соответствовать персонажу, который вы ищете. Используйте $'\r'.

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