Почему вкладка не будет вставлена ​​в первую добавленную строку?

Я пытаюсь добавить несколько строк в файл, все с ведущей вкладкой. Строки должны быть вставлены в первую строку после сопоставления строки.

Предположим, что файл содержит только одну строку и называется "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, и его тривиально изменить, чтобы сделать что-то еще, что вы, возможно, захотите сделать в будущем.

Другие вопросы по тегам