2013-02-18 5 views
0

мой первый пост здесь и начальный уровень. Есть ли способ решить эту проблему с помощью sed (или любых других средств)? Я хочу ежедневно обрабатывать недавно созданный файл и заменять некоторые входы IP и портов.Замените неповторимые вхождения с командой sed или другой командой

1) Я хочу заменить первое появление «5027,5028» на A3, а второе - на A4. 2) Я хочу заменить первое появление «5026» на A1, а второе - на A2.

PS. Я попытался упростить этот пример и оставил предыдущие строки с версией = "y" или version = "x", что могло бы помочь отличить вхождения от eachother. (Первая пара версий x и y является основным соединением, а две другие - вторичным).

входного файла:

version="x" 
commaSeparatedList="5027,5028"` 
version="y" 
commaSeparatedList="5026" 
version="x" 
commaSeparatedList="5027,5028" 
version="y" 
commaSeparatedList="5026" 

Отредактированный файл:

version="1.4.1-12" 
commaSeparatedList="A3" 
version="1.3.0" 
commaSeparatedList="A1" 
version="1.4.1-12" 
commaSeparatedList="A4" 
version="1.3.0" 
commaSeparatedList="A2" 

К сожалению, у меня был какой-то ужас редактирования в течение нескольких минут. Надеюсь, теперь это будет легче понять. Я в основном получаю этот файл в системе, которая развернута в ночное время, и я хочу отредактировать этот файл с помощью задания cron, прежде чем он начнет следить за работой соединения.

+0

два вопроса: 1) Можно ли продублированы числа в одной строке ? как бороться, если ture. 2), что, если 3-й, 4-й ... 5026 приходит ... держите 'A2'? или это не произойдет? – Kent

+0

и третий вопрос, почему вход y-y-x-y, выход x-y-x-y? – Kent

ответ

2

Не беспокойтесь, пытаясь использовать sed для этого. Это можно сделать, но sed - неправильный инструмент.

Используйте вместо этого awk. Чтобы заменить первое появление «5027,5028» на A3, а второе - на A4.

awk '/5027,5028/ && count < 2 { if(count ++) repl="A4"; else repl="A3"; 
    sub("5027,5028", repl)} 1' input 

Вторая замена оставлена ​​в качестве упражнения. Это в основном то же самое, и вы можете либо запустить awk дважды, либо просто добавить дополнительные пункты выше.

Для перезаписи исходного файла, используйте оболочки переназначения:

awk ... input > tmpfile && mv tmpfile input 
+0

Очень ценится, проверит его очень скоро! –

1

Это может работать для вас (GNU SED):

sed '1,/5027,5028/s/5027,5028/A3/;s/5027,5028/A4/;1,/5026/s/5026/A1/;s/5026/A2/' file 
+0

Это работало как шарм, спасибо! –

Смежные вопросы