У меня есть текстовый файл big5.conf F5, в котором я хочу изменить домен маршрута с 701 на 703 для всех строк, показывающих «10.166.201». Домен маршрута представлен% 701

10.166.201.10%701
10.166.201.15%701
10.166.201.117%701

Я могу сделать это с помощью bash, но проблема в том, что команда "else printf" (я также пробовал echo), которая должна выводить все остальные строки, неправильно анализирует такие вещи, как "\ r \ n" и оставляет их как "рн"

#!/bin/bash

while read line
do
if [[ $line = *"10.166.201"* ]]; 
    then
printf '%s\n' "$line" | sed -e 's/701/703/'

else printf '%s\n' "$line"  

fi  

done < bigip.conf > bigip.conf_updated

Есть ли способ остановить printf и echo от изменения "\ r \ n"?

Есть ли лучший способ сделать это в sed / awk?

Спасибо.

1
Paul Dawson 24 Фев 2018 в 13:32

4 ответа

Лучший ответ

Используйте адрес регулярного выражения:

sed '/10\.166\.201\./s/%701/%703/' bigip.conf

Убедившись, что команда работает для вас, вы можете изменить файл на месте, используя -i:

sed -i'' '/10\.166\.201\./s/%701/%703/' bigip.conf

С помощью GNU sed вы можете опустить значение параметра -i:

sed -i '/10\.166\.201\./s/%701/%703/' bigip.conf
1
hek2mgl 24 Фев 2018 в 15:18

sed :

sed -E 's/(10\.166\.201\.[[:digit:]]+%70)1/\13/'
  • Захваченная группа, (10\.166\.201\.[[:digit:]]+%70) соответствует 10.166.201. буквально, затем одной или нескольким цифрам, затем %70 буквально

  • За пределами захваченной группы 1 соответствует буквально; в замене используется захваченная группа и 1 заменяется на 3

< Сильный > Пример:

% cat file.txt
10.166.201.10%701
10.166.201.15%701
10.166.201.117%701

% sed -E 's/(10\.166\.201\.[[:digit:]]+%70)1/\13/' file.txt
10.166.201.10%703
10.166.201.15%703
10.166.201.117%703
1
heemayl 24 Фев 2018 в 10:38

Четкий, простой, надежный и эффективный способ:

awk 'BEGIN{RS=ORS="\r\n"; FS=OFS="%"} index($1,"10.166.201.")==1{ $2="703" } 1' file

Обратите внимание, что вам не нужно экранировать . s или якорь, чтобы избежать частичных совпадений, потому что выше просто обрабатывает IP-адрес как строку, появляющуюся в начале строки. Выше используется GNU awk для RS с несколькими символами, чтобы сохранить ваши \r\n окончания строки.

1
Ed Morton 24 Фев 2018 в 14:25

Следующий awk может помочь вам в этом же.

awk '{gsub(/\r/,"")} /your_string/{sub(/701/,"703")} 1'   Input_file

Также, если вы хотите сохранить выходные данные в том же самом файле Input_file, выполните следующие действия:

awk '{gsub(/\r/,"")} /your_string/{sub(/701/,"703")} 1'  Input_file > temp_file && mv temp_file  Input_file

РЕДАКТИРОВАТЬ: Если в вашем Input_file есть \r, тогда я добавил {gsub(/\r/,"")} в мои коды выше, если у вас их нет, вы мог удалить их из кодов.

EDIT2: При изменении строки на your_string также измените . на \. в вашем адресе.

1
RavinderSingh13 24 Фев 2018 в 12:41