Один раз запустите scp
, а затем скопируйте его локально на удаленный сервер.
$ scp file.txt my-remote-vm-1:/tmp
$ ssh my-remote-vm-1 'for i in /tmp/conf-[0-9]-ver-[0-9]; do cp /tmp/file.txt "$i"; done'
$ ssh my-remote-vm-1 rm /tmp/file.txt
Если у вас есть несколько похожих строк в одном файле, вам нужно будет ввести:
sed -i ':a;N;$!ba; s/27020/22443/2' file
Где /2 означает, что второе совпадение будет заменено на 27020 . Вы можете протестировать команду с помощью команды sed без параметра -i, чтобы увидеть, какой результат вы получите.
В противном случае с простым sed -i 's/27020/22443/g' file
это было бы правильно, если вы знаете, какой файл изменить.
Я предполагаю, что reader_0
имеет host = hostanme 1
, reader_1
имеет host = hostname 2
и так далее.
Вы можете использовать эту команду для заменыfile
:
sed -i '/host = "hostname 2",/{N;s/port = 27020,/port = 22443,/}' file
Использование предшественника sed ed:
ed -s input <<< $'/^reader_1 =\n/^port =\nc\nport = 22443,\n.\nw\nq'
Это отправляет ed
строку команд ANSI -, цитируемую здесь -, для редактирования файла. Команды в последовательности:
/^reader_1 =
--поиск строки, начинающейся с "reader _1=" /^port =
--искать оттуда строку, начинающуюся с "port=" c
--изменить эту строку port = 22443,
--к этому тексту .
--конец текста замены w
--записать файл на диск q
--выйтиed
Вы можете ужесточить или ослабить регулярные выражения, чтобы они соответствовали более или менее точно, в соответствии с вашими фактическими данными.
Это может быть лучше сделано с помощью awk
, в котором вы можете использовать машинный метод состояния -:
awk '/^reader_1 = newcamd\({/ { section_found = 1} /})/ { section_found = 0 } section_found && /port = 27020,$/ { sub(/27020,$/, "22443,") } { print }' file1 > file2 && mv file2 file1
Пояснение:
Установить флаг при обнаружении начала раздела:
/^reader_1 = newcamd\({/ {
section_found = 1
}
Очистить флаг при обнаружении конца раздела:
/})/ {
section_found = 0
}
Подставить новый номер порта в правой части и в правой строке:
section_found && /port = 27020,$/ {
sub(/27020,$/, "22443,")
}
Печать всех строк:
{
print
}
Отправить вывод в файл2 (временный файл):
> file2
Если все прошло успешно, переименуйте файл2 в файл1:
&& mv file2 file1
Вы можете сделать регулярные выражения настолько свободными или жесткими, насколько вам нужно.
Этот тип кода легче читать и поддерживать, чем код sed
или ed
, особенно если вы отформатируете его так же, как в моем объяснении.