Использование sed в скрипте - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь вставить строку текста под строкой существующего текста в файле согласно следующей выдержке:

#!/bin/bash

MATCH='Text_To_Look_For'
INSERT='Text_To_Add'
FILE='/home/user/test.txt'


echo "Modifying file..."
sed -i 's/"$MATCH/$MATCH"\n"$INSERT"/' $FILE

echo "Done."

Я пробовал все виды комбинаций / 'и " но не могу заставить его работать.Скрипт запустится сейчас, но ничего не вставит.В других форматах я продолжаю получать сообщения об ошибках:

неопределенная команда s sed: -e выражение # 1, символ 35: неизвестная опция для `s '

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы не сказали, какую версию sed вы используете, я видел что-то похожее на MacOS, где стандартное sed довольно плохое ... Обошлось, установив GNU Sed (вызывается позже как gsed).

В любом случае, можете ли вы попробовать команду sed a (что означает append ):

#!/bin/bash

MATCH='Text_To_Look_For'
INSERT='Text_To_Add'
FILE='/tmp/xxx'


echo "Modifying file..."
sed -i "/$MATCH/a $INSERT" $FILE

echo "Done."

С наилучшими пожеланиями, Ярек

0 голосов
/ 22 мая 2018

За параметром -i для sed должно следовать расширение файла, см. man sed: -i extension - Редактировать файлы на месте, сохраняя резервные копии с указанным расширением.

Он пытается использовать вашу команду s в качестве расширения имени файла!

Попробуйте это:

sed -i .bak s/$MATCH/$MATCH\n$INSERT/ "$FILE"

Обратите внимание, что опция -i нестандартна и sed версии различаются.Например, вам, возможно, придется удалить пробел:

sed -i.bak s/$MATCH/$MATCH\n$INSERT/ "$FILE"

Альтернативой -i является:

if sed s/$MATCH/$MATCH\n$INSERT/ "$FILE" > "$FILE.bak"
then
    mv "$FILE.bak" "$FILE"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...