Как правильно вставить вкладку в sed? - PullRequest
16 голосов
/ 06 декабря 2011

Как правильно вставить вкладку в sed? Я вставляю строку заголовка в поток, используя sed. Я мог бы, вероятно, сделать замену какого-нибудь символа позже, чтобы поместить его во вкладку с помощью регулярного выражения, но есть ли лучший способ сделать это?

Например, скажем, у меня есть:

some_command | sed '1itextTABtext'

Мне бы хотелось, чтобы первая строка выглядела так (текст отделяется символом табуляции):

text    text

Я попытался заменить TAB в приведенной выше команде на "\ t", "\ x09", "" (сама вкладка). Я пробовал это с двойными кавычками и без них, и я не могу заставить sed вставить вкладку между текстом.

Я пытаюсь сделать это в SLES 9.

Ответы [ 7 ]

12 голосов
/ 06 декабря 2011

Предполагается, что bash (и, возможно, другие оболочки тоже будут работать):

some_command | sed $'1itext\ttext'

Bash обработает экранирование, например \t, внутри $' ', прежде чем передать его как аргумент sed.

11 голосов
/ 06 декабря 2011

Вы можете просто использовать команду sed i правильно:

some_command | sed '1i\
text    text2'

, где, как я надеюсь, это очевидно, есть вкладка между «text» и «text2».В MacOS X (10.7.2) и, следовательно, возможно, на других платформах на базе BSD, я смог использовать:

some_command | sed '1i\
text\ttext2'

и sed, переведя \t во вкладку.

Если sed не будет интерпретировать \t и вставка вкладок в командной строке является проблемой, создайте сценарий оболочки с редактором и запустите этот сценарий.

3 голосов
/ 09 апреля 2015

Как говорит большинство ответов, вероятно, буквальный tab char - лучший.

info sed говоря " \ t не является переносимым. ":

... '\CHAR' Matches CHAR, where CHAR is one of '$', '*', '.', '[', '\', or '^'. Note that the only C-like backslash sequences that you can portably assume to be interpreted are '\n' and '\'; in particular '\t' is not portable, and matches a 't' under most implementations of 'sed', rather than a tab character. ...

3 голосов
/ 06 декабря 2011

Сед может сделать это, но это неудобно:

% printf "1\t2\n3\t4\n" | sed '1i\\
foo bar\\
'
foo bar
1   2
3   4
$

(двойная обратная косая черта вызвана тем, что я использую tcsh в качестве оболочки; если вы используете bash, используйте одиночную обратную косую черту)

Пробел между foo и bar - это вкладка, которую я набрал, добавив к ней Ctrl V . Вам также нужно будет добавить новые строки внутри одинарных кавычек с помощью Ctrl V .

Вероятно, было бы проще / понятнее сделать это с помощью awk:

$ printf "1\t2\n3\t4\n" | awk 'BEGIN{printf("foo\tbar\n");} {print;}'
1 голос
/ 22 сентября 2017

экранировать символ табуляции:

sed -i '/<setup>/ a \\tmy newly added line' <file_name>

ПРИМЕЧАНИЕ: выше у нас есть две обратные косые черты (\), первая для escape-символа (), а следующая - для фактического символа табуляции (\т)

1 голос
/ 19 апреля 2017

Чтобы проиллюстрировать тот факт, что синтаксис BRE для sed упоминает, что \t не является переносимым, Git 2.13 (Q2 2017) избавляется от него.

См. коммит fba275d (01 апреля 2017 г.) Джунио С. Хамано (gitster) .
(Объединено Джунио С. Хамано - gitster - in commit 3c833ca , 17 Apr 2017)

contrib/git-resurrect.sh: не писать \t для HT в sed сценариях

Точно так же, как мы это делали в 0d1d6e5 t/t7003: замените \t на буквенную табуляцию в sed выражении», 2010-08-12, Git 1.7.2.2), избегайте написания «\t "для HT в sed сценариях, которые не переносимы.

-   sed -ne 's~^\([^ ]*\) .*\tcheckout: moving from '"$1"' .*~\1~p'     
+   sed -ne 's~^\([^ ]*\) .*     checkout: moving from '"$1"' .*~\1~p'
                            ^^^^
                             |
                        (literal tab)
1 голос
/ 06 декабря 2011

Я нашел альтернативный способ вставить вкладку с помощью подстановки.

some_command | sed '1s/^/text\ttext\n/'

Я до сих пор не знаю, как это сделать, используя метод вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...