-1

У меня есть этот входной файл в Ubuntu:

146.14.142.96.17747 197.102.40.184.13748:
146.14.142.96.17747 197.102.40.184.13749: 
146.14.142.96.17747 197.102.40.184.13750:
146.114.142.96.17747 197.102.40.184.13751:
46.14.142.96.17747 197.102.40.184.13752:

и я хотел бы получить такой вывод, используя сценарии оболочки:

разделить два IP-адреса без номера порта я имею в виду удалить порты

146.14.142.96 197.102.40.184
146.14.142.96 197.102.40.184 
146.14.142.96 197.102.40.184
146.114.142.96 197.102.40.184
46.14.142.96 197.102.40.184

2 ответа2

3

Для строк, отформатированных точно так, как показано в вопросе, это будет делать:

sed -E 's/\.[0-9]+[ :]/ /g' input-file

Как это устроено:

  • -E включает расширенные регулярные выражения.

  • s/SEARCH/REPLACE/g глобально (/g) заменяет (s/) SEARCH на REPLACE.

  • \.[0-9]+[ :] соответствует точке, следующей за любым положительным числом цифр после пробела или двоеточия.

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

sed -E 's/(([0-9]+\.){3}[0-9]+)[^ ]+/\1/g' input-file

Как это устроено:

  • ([0-9]+\.){3}[0-9]+ соответствует IP (три группы цифр, за которыми следуют точки плюс дополнительная группа цифр).

  • В круглых скобках предыдущее совпадение объявляется как первое совпадение (\1).

  • [^ ]+ соответствует любому непробельному символу, который следует за IP.

0

Выполните поиск и замену с помощью регулярных выражений

(\d+\.\d+\.\d+\.\d+)\.\d+(:?)

и заменить текст

\1

Различные инструменты поддерживают поиск и замену регулярных выражений, хотя диалект может немного отличаться. Выше работает с Notepad++.

Или в VIM вы можете сделать

:s/\(\d\+\.\d\+\.\d\+\.\d\+\)\.\d\+\(:\?\)/\1/g

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .