sed: выражение № 1-e, символ 10: дополнительные символы после команды

Я хотел бы проводить первые 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

Что я делаю неправильно?

1
задан 24 October 2018 в 13:55

3 ответа

Как избежать переменных оболочки:

  • с 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
    
1
ответ дан 3 December 2019 в 06:50

Сначала Вы не должны использовать канал между переменным присвоением 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
3
ответ дан 3 December 2019 в 06:50
  • Добавьте в конец файла

    head -n2 test.txt >> output.txt
    
  • Добавьте к началу работ @steeldriver файла

0
ответ дан 3 December 2019 в 06:50

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

Похожие вопросы: