Как заменить табы, используя sed

Утилита командной строки sed (это потоковый редактор), как-то неочевидно работает с символом табуляции (tab). Выражения «\t», «\x09», «\011» не срабатывают даже в расширенном режиме регулярных выражений (включается флагами „-r“ или „-E“, в зависимости от системы).

Я немного поэксперементировал, оказалось, что sed вполне воспринимает этот символ как таковой, а все «магические выражения» не работают. Поскольку «таб» имеет специальное значение в командной строке, ввести его можно либо через комбинацию Ctrl+V, tab, либо Ctrl+V, Ctrl+I. Во многих шеллах (например, в bash, ksh, sh) сработает специальный синтаксис с долларом, как в примере ниже.

Например, если вам надо заменить последовательные «табы» на один, то это может выглядеть вот так:
sed $'s/\t\t*/\t/g' sample.txt # именно \t\t*, а не \t+

# или

sed -E $'s/\t+/\t/g' sample.txt # в Линуксе ключ „-r“
Если вы знаете как в sed можно работать с tab проще, расскажите, пожалуйста, в комментариях.
18 ноября 2011 08:57

voldmar (voldmar.ru)
18 ноября 2011, 09:39

Я сейчас вспомнил, что всегда вводил табуляцию и перевод строки через Ctrl-V, что в Виме, что в шелле. Видимо давно на эту проблему наткнулся, так и привык.

Sergey Solyanik (profiles.google.com/jankkhvej/)
19 ноября 2011, 14:19

Почему именно sed?

bolk (bolknote.ru)
19 ноября 2011, 16:01, ответ предназначен profiles.google.com/jankkhvej/:

Почему именно sed что?

justthefish@twitter.com (инкогнито)
25 ноября 2011, 16:25

/режим штатного телепата on
Вопрос видимо был - почему sed а не awk
/режим штатного телепата off

PS
awk '{gsub("\t","x");print}' myfile.txt

bolk (bolknote.ru)
25 ноября 2011, 22:13, ответ предназначен justthefish@twitter.com

gsub("\t+", "\t") только.

Ну тогда это вопрос из разряда «а почему не Perl?», много как эту задачу решить можно, почему бы и не седом.

Ы (инкогнито)
31 марта 2013, 14:48

sed '1i\\tText' file

Евгений Степанищев (bolknote.ru)
31 марта 2013, 16:26, ответ предназначен Ы

sed: 1: "1i\\tText": extra characters after \ at the end of i command

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)