Как заменить линию ниже в скрипте Bash?

Оригинальная линия -

mongoose.connect('mongodb://localhost/Dbname', {useNewUrlParser: true, useFindAndModify: false })

Необходимо заменить -

mongoose.connect('mongodb://username:Password@host1.localhost.com:27017,host2.localhost.com:27017,host3.localhost.com:27017/DBname?authSource=admin&w=1&replicaSet=replicaname&readPreference=secondaryPreferred&retryWrites=true',{useNewUrlParser: true, useFindAndModify: false })

, пока мы пытаемся заменить эту строку через команду ниже

sed -i 's+mongodb://localhost/Dbname+mongodb://username:Password@host1.localhost.com:27017,host2.localhost.com:27017,host3.localhost.com:27017/DBname?authSource=admin\\\&w=\\\1&replicaSet=replicaname&readPreference=secondaryPreferred\\&retryWrites=true/g' app.js

, мы получаем разные вывода.

mongoose.connect('mongodb://username:Password@host1.localhost.com:27017,host2.localhost.com:27017,host3.localhost.com:27017/DBname?authSource=admin\mongodb://localhost/Dbnamew=1\mongodb://localhost/DbnamereplicaSet=replicaname\mongodb://localhost/DbnamereadPreference=secondaryPreferred\mongodb://localhost/DbnameretryWrites=true', {useNewUrlParser: true, useFindAndModify: false })
0
задан 24 March 2021 в 12:21

1 ответ

Я предоставляю два способа достижения вашей цели. Хитрость в том, как иметь дело с & как строка литерала ( исх , исх ). Я предполагаю, что файл test.txt содержит вашу базовую строку.

awk -v old="mongodb://localhost/Dbname" -v new="mongodb://username:Password@host1.localhost.com:27017,host2.localhost.com:27017,host3.localhost.com:27017/DBname?authSource=admin&w=1&replicaSet=replicaname&readPreference=secondaryPreferred&retryWrites=true" 's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))} 1' test.txt 

awk -v old="mongodb://localhost/Dbname" '{ gsub(old, "mongodb://username:Password@host1.localhost.com:27017,host2.localhost.com:27017,host3.localhost.com:27017/DBname?authSource=admin\\&w=1\\&replicaSet=replicaname\\&readPreference=secondaryPreferred\\&retryWrites=true") ; print $0 }' test.txt

и более гибкая версия, которая позволяет другим поискам строк. Здесь сложная часть, как иметь дело с ' в качестве разделителя полей для AWK ( исх ).

awk 'BEGIN { FS = "'\''" } ; { gsub($2, "mongodb://username:Password@host1.localhost.com:27017,host2.localhost.com:27017,host3.localhost.com:27017/DBname?authSource=admin\\&w=1\\&replicaSet=replicaname\\&readPreference=secondaryPreferred\\&retryWrites=true") ; print $0 }' test.txt
0
ответ дан 1 April 2021 в 23:01

Другие вопросы по тегам:

Похожие вопросы: