Почему вкладка не будет вставлена в первую добавленную строку?
Я пытаюсь добавить несколько строк в файл, все с ведущей вкладкой. Строки должны быть вставлены в первую строку после сопоставления строки.
Предположим, что файл содержит только одну строку и называется "my-file.txt" следующим образом:
foo
Я попробовал следующую команду sed:
sed "/^foo\$/a \tinsert1\n\tinsert2" my-file.txt
Это дает следующий вывод:
foo
tinsert1
insert2
Обратите внимание, что вкладка, которая должна быть в первой (вставленной) строке, опущена. Вместо этого он печатает дополнительный ведущий 't'.
Почему? И как я могу изменить свою команду для печати вкладки в первой строке, как и ожидалось?
2 ответа
С GNU sed:
sed '/^foo$/a \\tinsert1\n\tinsert2' file
<---- single quotes! --->
Производит:
foo
insert1
insert2
Из руководства:
a \ text Append text, which has each embedded newline preceded by a backslash.
Поскольку тексту, который нужно добавить самому, должен предшествовать обратный слеш, он должен быть \\t
в начале.
PS: Если вам нужно использовать двойные кавычки вокруг команды sed, потому что вы хотите вставить переменные оболочки, вам нужно экранировать \, предшествующий добавляемому тексту:
ins1="foo"
ins2="bar"
sed "/^foo\$/a \\\t${ins1}\n\t${ins2}" file
Sed предназначен для выполнения s/old/new для отдельных строк, вот и все. Просто используйте awk:
$ awk '{print} $0=="foo"{print "\tinsert1\n\tinsert2"}' file
foo
insert1
insert2
Вышеупомянутое будет работать с использованием любого awk в любой оболочке на каждом компьютере UNIX, и его тривиально изменить, чтобы сделать что-то еще, что вы, возможно, захотите сделать в будущем.