Команды Sed изменяют файлы специальными символами - PullRequest
0 голосов
/ 01 марта 2020

В проекте требуется заменить некоторые строки специальными символами в файле, например

Образец файла - пример ввода

file.conf

bridge.mqtt.aws.mountpoint = aws/

bridge.mqtt.aws.certfile = etc/certs/client-cert.pem

Команда Sed one

Я набираю команду Sed следующим образом

sed -i "s/aws/test/g" ./file.conf

Результат один

Результаты следующие

bridge.mqtt.test.mountpoint = test/
# The line I would expect would be `bridge.mqtt.test.mountpoint = aws/`


bridge.mqtt.test.certfile = etc/certs/client-cert.pem

Я знал, что смогу удалите g, чтобы соответствовать первому в строке, но я беспокоюсь, что есть multiple places in a row, которые должны быть сопоставлены.

команда SED два

Итак, я использую совпадение удлиненной строки, команда Sed следующим образом sed -i "s/.aws./.test./g" ./file.conf,

результат два

, который не удалось как следует

bridge.mqtt.test.mountpoint =.test.
# The line I would expect would be `bridge.mqtt.test.mountpoint = aws/`

bridge.mqtt.test.certfile = etc/certs/client-cert.pem

Как мне изменить инструкцию sed для достижения желаемого эффекта

желаемый результат

Используйте команду типа sed command two, чтобы получить следующее результаты sed

bridge.mqtt.test.mountpoint = aws/

bridge.mqtt.test.certfile = etc/certs/client-cert.pem

1 Ответ

1 голос
/ 01 марта 2020

Вы говорите, что удаление g не будет работать, но все приведенные вами примеры будут работать, как и ожидалось. Вы не предоставили контрпримеров, которые не дали бы ожидаемый результат, поэтому мой ответ основан на предположении, что вы хотите заменить «aws», только если ему предшествует точка:

sed -i 's/\.aws/.test/g' ./file.conf

Это, конечно, не будет работать, если часть после символа = также содержит точку.

Ввод:

bridge.mqtt.aws.mountpoint = aws/
bridge.mqtt.aws.certfile = etc/certs/client-cert.pem

Выход:

bridge.mqtt.test.mountpoint = aws/
bridge.mqtt.test.certfile = etc/certs/client-cert.pem

Не будет работать с вводом:

bridge.mqtt.aws.mountpoint = /hidden/dir/.aws/

, что приведет к:

bridge.mqtt.test.mountpoint = /hidden/dir/.test/

Но, возможно, предоставленное решение уже достаточно хорошо для вашего набора ввода.

Обратите внимание, что что-то вроде "aws123" также будет заменено на "test123", что может или не может быть тем, что вы хотите сделать.

Дополнительные идеи

Если вы не возражаете, запустить "очистку" Сценарий "несколько раз подряд (например, есть ли что-то, что нужно заменить? -> запустить sed), вы можете сделать следующее, чтобы заменить только" aws ", перед ним нет символа =):

sed 's/^\([^=]*\)\.aws/\1.test/g'
...