2016-03-23 2 views
-1

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

scenario1{ 
user_range:="1..100" 
ip_low:="192.168.1.1" 
ip_high:=192.168.1.100 
... 
} 
scenario2{ 
user_range:="101..200" 
ip_low:="192.168.2.1" 
ip_high:=192.168.2.100" 
... 
} 
... 

Я хочу заменить некоторые значения с помощью sed -i. Но я не могу понять, как итерации по ключевому слову «сценарий», чтобы изменить user_ranges и ips для всего файла.

+0

Что ожидается выход? – anubhava

+0

изменили поля user_range, ip_low, ip_high. Я установил вручную некоторые начальные значения (например, 250 для пользовательского диапазона и некоторые ips). 'sed' изменяет' user range' в 'stage1' до 1..250, в' scene2' 251..500 ... и так далее. О ips: Мне нужно изменить только 3-й октет ip, увеличенный на 1. Как мой конечный результат должен выглядеть. Но для меня главной проблемой здесь является итерация внутри файла по ключевым словам. – ascentman

+0

Используйте 'awk' или что-то еще, что вы можете написать реальную логику и т. Д. В (' perl', 'python',' ruby' и т. Д.). –

ответ

2

awk на помощь!

$ awk -v RS='\n}' 'BEGIN{OFS="\n"} 
     {from=250*c+1; to=250*(++c); 
     sub(/:=.*/,":=\""from".."to"\"",$2)} 
     {print $0 RT}' file 

scenario1{ 
user_range:="1..250" 
ip_low:="192.168.1.1" 
ip_high:=192.168.1.100 
... 
} 
scenario2{ 
user_range:="251..500" 
ip_low:="192.168.2.1" 
ip_high:=192.168.2.100" 
... 
} 

IP-адреса могут быть выполнены аналогичным образом, если есть обычный шаблон.

+0

это работает только в том случае, если в файле есть 2 сценария. Я думал о таком алгоритме, как: найти ключевое слово 'script' и увеличить user_range для некоторых значений, затем найти следующее ключевое слово' script', увеличить все это снова на основе значений из предыдущего сценария. но я не уверен, могу ли я связаться с ним в битве. – ascentman

+0

Почему, по-вашему, ограничивается только двумя? Это для ввода данных. Вы попробовали более крупный образец? – karakfa

+1

Только bash будет болезненным, используйте в вашем распоряжении другие мощные текстовые инструменты, такие как всемогущий awk. – karakfa

2

Если вы настаиваете на использовании sed Вам может быть проще, если вы сначала конвертируете файл в формат csv.

tr '\n' ',' <testfile | tr '}' '\n' | tr -d "{" |sed 's/^,*//g;s/,*$//g' >csvfile 

Поскольку это приводит к одному сценарию на линию, это будет намного проще в использовании sed

2

Это довольно легко с простым Башем отделить значение. Я предполагаю, что порядок пар ключ-значение и количество новых строк на станну остаются неизменными (только для демонстрационных целей)

while read line 
do 
         scenario=${line//\{/} 
     read line;  user_range=${line} 
     read line;  ip_low=${line} 
     read line;  ip_high=${line} 
     read line;  endchar=${line} 

     # here you can insert every piece of code you need 
     # to change your variables 

     cat<<-EOF 
       $scenario{ 
       $user_range 
       $ip_low 
       $ip_high 
       } 
     EOF 
done <file_like_your_example >new_file