Каков правильный способ вставки вкладки в sed?

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

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

some_command | sed '1itextTABtext'

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

text    text

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

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

Ответ 1

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

some_command | sed '1i\
text    text2'

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

some_command | sed '1i\
text\ttext2'

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

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

Ответ 2

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

some_command | sed $'1itext\ttext'

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

Ответ 3

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

% 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;}'

Ответ 4

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

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....

Ответ 5

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

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

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

Ответ 6

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

См. Commit fba275d (01 апреля 2017 года) Юнио С Хамано (gitster).
(Слияние с Юнио С Хамано - gitster - в совершении 3c833ca, 17 апреля 2017 года)

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

Как и в случае 0d1d6e5 (" t/t7003: replace \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)

Ответ 7

выйдите из символа табуляции:

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

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