Я хотел бы проводить первые 2 строки из test.txt:
hello
my
name
is
и помещенный их наверху нового файла, output.txt:
foo
bar
с желаемым выводом тем, чтобы быть, output.txt:
hello
my
foo
bar
использование sed. Однако использование:
text=$(head test.txt -n 2) | sed -i "1i $text" output.txt
возвраты ошибка:
sed: -e expression #1, char 10: extra characters after command
Что я делаю неправильно?
Как избежать переменных оболочки:
с ed
printf '0r !head -n2 test.txt\nwq\n' | ed -s output.txt
с sed
(немного сложнее, так как r
команда не разрешает адрес 0
)
head -n 2 test.txt | sed -i -e '1{h;r /dev/stdin' -e 'd;}' -e '2{H;x;}' output.txt
Сначала Вы не должны использовать канал между переменным присвоением text=
и sed
команда. Необходимо заменить разделителем команды ;
.
Во-вторых, можно получить ошибку, потому что часть текста замены интерпретируется sed
. На самом деле необходимо заключить замещающую строку в кавычки. Это может быть, покончили bash
оператор расширения параметра @Q
.
text=$(head -n2 test.txt)
sed -i "1i ${text@Q}" output.txt
Как упомянуто в bash
страницы справочника:
$ {parameter@operator}
...
Q расширение строка, которая является значением параметра, заключенного в кавычки в формате, который может быть снова использован, как введено.
Очевидно, вставляя, прежде чем строка 1 совпадает с выполнением:
head -n2 text.txt > /tmp/temp.txt
cat output.txt >> /tmp/temp.txt && mv /tmp/temp.txt ouput.txt
Добавьте в конец файла
head -n2 test.txt >> output.txt
Добавьте к началу работ @steeldriver файла