2015-09-29 2 views
2

У меня есть файл (файл pac), который содержит IP-адреса для определенной корпорации и хочет затенять каждый IP-адрес внутри него. Одна из моих идей заключалась в том, чтобы добавить 1 к каждой цифре в файле и изменить итоговое число с 256, чтобы он по-прежнему оставался действительным IP-адресом.Измените все числа в блоке текста сразу

Для 129 например станут 2310 % 256 = 6

Есть быстрый способ применить такие изменения с помощью Vim? Это звучит амбициозно, но я думал, что все равно спрошу. Вот пример одного блока из файла.

if (

    isInNet(ip, "111.222.123.234", "255.255.255.224") || 

    isInNet(ip, "166.19.10.14", "255.255.255.192") || 


) 

{return "DIRECT";} 
+0

Я добавил ответ, чтобы вы начали, но я не знаю, где ты получают 129 или 2310 от –

+0

Спасибо @ AndyRay Я дал 129 как простой пример. Это не IP-октет в опубликованном фрагменте. Позвольте мне попробовать ваше решение. – linuxfan

+0

Не было бы лучше заменить IP-адреса полностью случайными, вместо того чтобы применять слабое обратимое шифрование? –

ответ

4

Вот команда, которая делает все это единый поиск/замена:

:s/\d\+/\=substitute(tr(submatch(0), '', '1234567890'), '0', '10', 'g') % 256/g 

(Добавить свой собственный диапазон, например, выбрав блок в визуальном режиме и делать :'<,'>s (или :%s для всего файла)).

  • Начнем с сопоставления всех чисел (например, последовательностей цифр: \d\+).
  • Для каждого из них мы вращаем цифры: 0 становится 1, 1 становится 2, ..., 9 становится 0 (сделано с использованием tr()).
  • Но 9 должен был стать 10, не 0, поэтому мы применяем другую замену, которая превращает все 0 в 10 (сделано с использованием substitute()).
  • Окончательный результат затем принимается по модулю 256 (% 256).
+0

Это довольно удивительно. Шляпы и многое спасибо. – linuxfan

+0

Ähm, был прокладкой (0) +1 слишком легко? –

+0

@ChristianBrabandt Как '+ 1' превратить' 129' в '2310'? – melpomene

3

Вы можете использовать малоизвестный Vim в «выражение регистр» :h CTRL-R_=

В режиме вставки, если вы наберете Ctrl + г= открывает приглашение, которое вы можете сделать математику ,

Так что для этой линии:

isInNet(ip, "111.222.123.234", "255.255.255.224") || 

Этот шаблон будет делать это (курсор на первом 1)

  • сяж изменения внутри строчной слова
  • ctrl + г= Открыть выражение регистр
  • Ctrl + г" Вставить содержимое цитатой регистра, который является то, что вы просто сократить
  • Добавить % 256 и нажмите Enter

Вы должны иметь возможность макроопределить это и добавить +1 или скобки, где вам нужно.

1

Чтобы получить случайные IP-адреса, я рекомендую вам использовать внешнюю программу. Например. Баш или питон:

:%s/\d\+/\=system('bash -c "echo -ne $(((RANDOM % 256)))"')/ 
:%s/\d\+/\=system('python -c "import random,sys;sys.stdout.write(str(random.randint(0,255)))"')/ 

Вот более специфичный больше Oneliner, что соответствует только ipv4 адресу и генерирует целый IP-адрес:

:%s/\v(\d{1,3})(\.\d{1,3}){3}/\=system('python -c "import random,sys;sys.stdout.write(''.''.join(str(random.randint(0,255)) for i in range(4)))"')/ 
+0

Замечательно - спасибо за рецепт. – linuxfan

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