Sed удаляет содержимое файла xml if! {Q100};возврат используется - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть команда sed, которую я хочу запустить из скрипта bash для большого xml файла.

sed -i '/$OLD_IP_ADDRESS/!{q100};  {s/$OLD_GATEWAY/$NEW_GATEWAY/}'   $system_file 

, где, если присутствует $OLD_IP_ADDRESS, я заменяю $OLD_GATEWAY на $NEW_GATEWAY (IP) но $OLD_IP_ADDRESS если его нет, я возвращаю 100

Я использую следующее из

Код возврата sed для отсутствия совпадения

в качестве примера

kent$  echo "foo" | sed  '/foo/!{q100}; {s/f/b/}'
boo
kent$  echo $?
0

Однако, когда я запускаю команду, она удаляет все тело xml и оставляет только строку заголовка

У меня естьпробовал множество вариантов этого, но не понимаю / не вижу, где я закрываю файл.

Я искал, но не могу найти информацию по этому вопросу, поэтому любая помощь будет наиболее ценной.

1 Ответ

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

Как сказал @potong, вы не можете использовать опцию q sed в многострочном файле, потому что он никогда не будет работать , если в каждой строке нет того, что вы ищете.

Если вы хотите выполнить поиск, если что-то присутствует или нет, вы можете использовать grep перед выполнением замен.

Вы можете сделать что-то подобное:

#!/bin/bash
if grep -q -e "${OLD_IP_ADDRESS}" "${system_file}"; then
   sed -i -e "s/${OLD_GATEWAY}/${NEW_GATEWAY}/" "${system_file}"
else
   exit 100
fi

Этот фрагмент кода заменит каждое первое вхождение (опция g не используется) ${OLD_GATEWAY} на ${NEW_GATEWAY} в каждой строке, только если ${OLD_IP_ADDRESS} присутствует хотя бы один раз в файле.

Есливам нужен oneliner, вы можете использовать что-то вроде:

grep -q -e "${OLD_IP_ADDRESS}" "${system_file}" && sed -i -e "s/${OLD_GATEWAY}/${NEW_GATEWAY}/" "${system_file}"

, зная, что код выхода будет отличаться от 100.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...