Как заменить табы, используя 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 проще, расскажите, пожалуйста, в комментариях.
Я сейчас вспомнил, что всегда вводил табуляцию и перевод строки через Ctrl-V, что в Виме, что в шелле. Видимо давно на эту проблему наткнулся, так и привык.
Почему именно sed?
Комментарий для profiles.google.com/jankkhvej/:
Почему именно sed что?
/режим штатного телепата on
Вопрос видимо был — почему sed а не awk
/режим штатного телепата off
PS
awk ’{gsub(«\t»,«x»);print}’ myfile.txt
Комментарий для justthefish@twitter.com:
gsub(«\t+», «\t») только.
Ну тогда это вопрос из разряда «а почему не Perl?», много как эту задачу решить можно, почему бы и не седом.
sed ’1i\\tText’ file
Комментарий для Ы: