Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Как заменить табы, используя 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 проще, расскажите, пожалуйста, в комментариях.

7 комментариев
voldmar (voldmar.ru) 2011

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

Sergey Solyanik (profiles.google.com/jankkhvej/) 2011

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

Евгений Степанищев (bolknote.ru) 2011

Комментарий для profiles.google.com/jankkhvej/:

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

justthefish@twitter.com 2011

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

PS
awk ’{gsub(«\t»,«x»);print}’ myfile.txt

Евгений Степанищев (bolknote.ru) 2011

Комментарий для justthefish@twitter.com:

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

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

Ы 2013

sed ’1i\\tText’ file

Евгений Степанищев (bolknote.ru) 2013

Комментарий для Ы:

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