Каков правильный способ вставки вкладки в 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)