ошибка при вставке переменной оболочки в начало файла с помощью sed - PullRequest
0 голосов
/ 01 марта 2020

Я хочу добавить bash переменную (которая имеет html теги) в начале файла.

INSERTTO=<h2>title</h2>
<li>sdfdsf</li>

Ниже приведена команда, которую я использую -

sed -i '1i'$INSERTTO file.html

Но я получаю ошибку -

sed: -e expression #1, char 177: unknown command: `<'

Нужно ли мне кодировать теги html в переменной INSERTTO?

Ответы [ 3 ]

0 голосов
/ 01 марта 2020

Начните с некоторого текста в вашем файле, например,

$ cat file
some text

Затем ваша переменная должна содержать явный символ '\n', где находится разрыв строки, например, INSERTTO='<h2>title</h2>\n<li>sdfdsf</li>'. Затем вы можете использовать выражение sed, чтобы поместить обе строки в качестве начальных строк в файле, например,

$ INSERTTO='<h2>title</h2>\n<li>sdfdsf</li>'; sed "1i $INSERTTO" file
<h2>title</h2>
<li>sdfdsf</li>
some text

Теперь в настоящее время то, что будет сделано, было записано только в терминал stdout. Чтобы изменить файл на месте, вам нужно будет добавить опцию -i для sed (или -i.bak, чтобы сохранить резервную копию исходного файла с расширением .bak. (Однако вы предпочитаете это делать)

0 голосов
/ 01 марта 2020

Я предлагаю вам решение ed(1).

INSERTTO=<h2>title</h2>
<li>sdfdsf</li>

printf '%s\n' 1i "$INSERTTO" . w | ed -s file.html
  • Если файл не пустой, он будет работать. в противном случае используйте 0a в качестве адреса и команды вместо 1i

... Или используйте cat(1) и mv(1)

INSERTTO=<h2>title</h2>
    <li>sdfdsf</li>

Добавьте stdin помечать и использовать herestring работает в bash, но не в оболочках POSIX.

cat - file.html <<< "$INSERTTO" 

Вы должны увидеть вывод в стандартный вывод, перенаправить его в другой файл и переместить этот файл в исходный файл, что-то вроде этого.

cat - file.html <<< "$INSERTTO"  > tempfile && mv tempfile file.html

Однако, если файл html является символической ссылкой, он теперь не работает ... Обходным путем было бы использование другого cat.

cat - file.html <<< "$INSERTTO"  > tempfile && cat tempfile > file.html && rm tempfile.
0 голосов
/ 01 марта 2020

Прежде всего, используйте кавычки: INSERTTO='<h2>title</h2> <li>sdfdsf</li>'

Тогда попробуйте это:

sed "1 i $INSERTTO" file.html

...