найти и заменить строку ИЛИ добавить в конец файла - PullRequest
0 голосов
/ 03 февраля 2019

Можно ли найти и заменить строку в файле ИЛИ добавить строку в конец, если ее там нет?

Я знаю, что могу использовать это, чтобы найти и заменить :

sed -i -e "s/^SEARCH/LINE 1\nLINE 2/" file

Я знаю, что могу добавить к файлу следующим образом:

cat << EOF | tee -i file1 file2
LINE 1
LINE 2
EOF

Можно ли как-нибудь это объединить.Поэтому, если /^SEARCH.*$/ соответствует, тогда замените его, если нет, тогда добавьте замену в конец файла.

Обновите с лучшим примером ввода / вывода:

Например, если бы у меня был этот входной файл testfile:

Alpha
Bravo
Charlie

Допустим, я хотел найти и заменить Bravo на Bravo=bingo, ИЛИ добавитьBravo=bingo если Bravo нет, ожидаемый вывод:

Alpha
Bravo=bingo
Charlie

Это потому, что в файле существует Bravo, поэтому он заменяется.

Допустим, яхотел найти и заменить Delta на Delta=bingo, ИЛИ добавить Delta=bingo, если Delta нет, ожидаемый результат:

Alpha
Bravo
Charlie
Delta=bingo

Это потому, что Delta отсутствует в файле, поэтому он добавляется.

Ответы [ 4 ]

0 голосов
/ 03 февраля 2019

Запасная часть точно такая же, как в https://stackoverflow.com/a/54504046/1745001, но здесь она упрощена для этого конкретного случая использования, и настройка добавления, если не найдено, выполняется путем установки флага, если он найден, и печати наEND, если этот флаг не установлен:

awk 'BEGIN{new="LINE 1\nLINE 2"} /^SEARCH/{$0=new; f=1} {print} END{if (!f) print new}' file

Опять же, вышеупомянутое использует строки для замены и поэтому будет работать для любых символов, /^SEARCH/ является регулярным выражением, так как у вас, кажется, нетметасхемы regexp, но если бы вы это сделали, вы бы изменили это значение на index($0,"SEARCH")==1 или подобное, чтобы сделать строку, а не совпадение с регулярным выражением.

0 голосов
/ 03 февраля 2019

GNU sed однострочный:

sed -i 's/^SEARCH/LINE 1\nLINE 2/;ts;bt;:s;h;:t;${x;/./!{x;s/$/\nLINE 1\nLINE 2/;be};x};:e' file
0 голосов
/ 03 февраля 2019

awk one-liner:

awk 'gsub(/^SEARCH/,"LINE 1\nLINE 2"){s=1}END{if(!s)print "LINE 1\nLINE 2"}1' file

Это не заменяет на месте, хотя, если вы хотите изменения на месте:

awk 'gsub(/^SEARCH/,"LINE 1\nLINE 2"){s=1}END{if(!s)print "LINE 1\nLINE 2"}1' file | tee file

Не забудьте выйти из оригинала и заменыесли они содержат regex символов, это проще, чем изменить метод match / substr, если текст не длинный.

0 голосов
/ 03 февраля 2019

Не знаю ни одной команды sed, но вы можете просто sed сделать резервную копию файла, а затем проверить разницу.Если нет разницы, добавьте в конец файла:

sed -i.bak -e 's/^SEARCH/LINE 1\nLINE 2/' file
diff file file.bak > /dev/null
if [ $? -eq 0 ]; then
    sed -i -e '$aLINE 1\nLINE 2' file
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...