Как заменить символы возврата на одну позицию (\ b) с помощью sed? - PullRequest
3 голосов
/ 03 марта 2011

Я хочу удалить фиксированное число вхождений некоторых символов возврата (\ b) из стандартного ввода.До сих пор я пробовал это:

echo -e "1234\b\b\b56" | sed 's/\b{3}//'

Но это не работает.Как я могу добиться этого, используя sed или какой-либо другой инструмент оболочки Unix?

Ответы [ 6 ]

9 голосов
/ 03 марта 2011

Вы можете использовать шестнадцатеричное значение для возврата на обратную сторону:

echo -e "1234\b\b\b56" | sed 's/\x08\{3\}//'

Вам также необходимо экранировать скобки.

4 голосов
/ 03 марта 2011

sed интерпретирует \b как границу слова. Я получил это для работы в Perl, например, так:

echo -e "1234\b\b\b56" | perl -pe '$b="\b";s/$b//g'
4 голосов
/ 03 марта 2011

Вы можете использовать tr:

echo -e "1234\b\b\b56" | tr -d '\b'
123456

Если вы хотите удалить три последовательных возврата, вы можете использовать Perl:

echo -e "1234\b\b\b56" | perl -pe 's/(\010){3}//'
2 голосов
/ 03 марта 2011

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

printf "12..\b\b34\n" | sed ':s; s#[^\x08]\x08##g; t s'
2 голосов
/ 03 марта 2011

С помощью sed:

echo "123\b\b\b5" | sed 's/[\b]\{3\}//g'

Вы должны выйти из { и } в {3}, а также обработать специальное \b, используякласс персонажей.

[birryree@lilun ~]$ echo "123\b\b\b5" | sed 's/[\b]\{3\}//g'
1235
1 голос
/ 03 марта 2011

Perl здесь не нужен!

# version 1
echo -e "1234\b\b\b56" | sed $'s/\b\{3\}//' | od -c

# version 2
bvar="$(printf '%b' '\b')"
echo -e "1234\b\b\b56" | sed 's/'${bvar}'\{3\}//' | od -c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...