Заменить строку между двумя шаблонами - PullRequest
0 голосов
/ 06 мая 2020

Исходная строка: allow from 1.1.1.1 9.9.9.9 2.2.2.2

Я хотел заменить 9.9.9.9 на 5.5.5.5, например, allow from 1.1.1.1 5.5.5.5 2.2.2.2

Цель состоит в том, чтобы заменить любую строку между allow from 1.1.1.1 и 2.2.2.2

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Я предполагаю, что остальная часть строки всегда allow from 1.1.1.1 перед частью, которую вы хотите изменить, и 2.2.2.2 после части, которую вы хотите изменить. Попробуйте:

string1="allow from 1.1.1.1 9.9.9.9 2.2.2.2"
new=5.5.5.5
string2=$(echo "$string1" | sed "/^\(allow from 1\.1\.1\.1\) .* \(2\.2\.2\.2\)$/s//\1 $new \2/")

Если вы не уверены, что всегда будете иметь 1.1.1.1 или 2.2.2.2, вам придется соответствующим образом изменить регулярное выражение, что довольно тривиально, например:

string2=$(echo "$string1" | sed "/^\(allow from [^ ]*\) .* \([^ ]*\)$/s//\1 $new \2/")
0 голосов
/ 06 мая 2020

Я бы использовал awk и передал IP-адреса в качестве параметров:

awk -v start="1.1.1.1" -v end="2.2.2.2" -v repl="5.5.5.5" '
    /allow from/ && $3 == start && $5 == end {$4 = repl}
    {print}
' file

Если вам нужно сохранить этот файл на месте, есть несколько вариантов:

awk ... file > tmpfile && mv tmpfile file
awk ... file | sponge file                   # requires the `moreutils` package
awk -i inplace -v ... file                   # requires GNU awk
0 голосов
/ 06 мая 2020

Что-то вроде этого?

new="5.5.5.5" perl -pe 's/(allow from 1.1.1.1 ).*?( 2.2.2.2)/$1$ENV{new}$2/' $YOUR_FILE

Для файла, содержащего

allow from 1.1.1.1 9.9.9.9 2.2.2.2
allow from 1.1.1.1 x 2.2.2.2
allow from 1.1.1.1 3.3.3 2.2.2.2

Он выведет следующее:

allow from 1.1.1.1 5.5.5.5 2.2.2.2
allow from 1.1.1.1 5.5.5.5 2.2.2.2
allow from 1.1.1.1 5.5.5.5 2.2.2.2

Он заменил все, что находится между "разрешить от 1.1.1.1 »и« 2.2.2.2 »с содержанием переменной $new, определенной перед командой perl.

Если вы хотите убедиться, что вы заменяете только группы из 4 цифр, разделенных точками, вы можете заменить .*? в регулярном выражении на что-то вроде \d\.\d\.\d\.\d. Если это адреса IPv4, вы также можете использовать \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} или менее строгий [\d\.]{7,15} (от 7 до 15 символов, все точки или цифры).

Если вы хотите сделать это «на месте» вместо распечатав результат в STDOUT, вы можете добавить -i.bak в качестве первого варианта. Это сначала создаст резервную копию "$ YOUR_FILE" в "$ YOUR_FILE.bak"

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