Замените все в текстовом файле после IP-адреса

У меня есть текстовый файл, в котором есть что-то вроде этого:

10.2.57.44      56538154    3028
120.149.20.197  28909678    3166
10.90.158.161   869126135   6025

В этом текстовом файле у меня около 400 000 строк точно так же, как указано выше. Я открыл тот же текстовый файл в Notepad++. Мне нужен был способ удалить все из этого текстового файла, оставив только IP-адрес (первый столбец в текстовом файле выше — это IP-адрес). Я думаю, я могу сделать это, используя регулярное выражение. И notepad ++ также имеет возможность использовать регулярное выражение. Но не уверен, какое регулярное выражение мне нужно использовать. Может кто-нибудь помочь мне здесь?

Таким образом, вывод должен быть примерно таким:

10.2.57.44
120.149.20.197
10.90.158.161

person arsenal    schedule 11.01.2013    source источник
comment
Добро пожаловать в регулярные выражения! Вам это понравится, особенно с Notepad++ на экране. Убедитесь и проверьте плагины, связанные с регулярными выражениями.   -  person Smandoli    schedule 11.01.2013


Ответы (3)


Просто замените \s.* ничем! Регулярному выражению нужно только соответствовать тому, что ему нужно, и то, что вы хотите сопоставить здесь, - это пробел, за которым следует что-либо (таким образом, оставляя IP-адрес в покое, поскольку он начинает строку и в ней нет пробелов)

В качестве альтернативы, если они у вас есть, это даже лучше сделать с помощью классической команды Unix:

sed -i 's/\s.*//' thefile

Пример:

$ cat <<EOF | sed 's/\s.*//'
> 10.2.57.44      56538154    3028
> 120.149.20.197  28909678    3166
> 10.90.158.161   869126135   6025
> EOF
10.2.57.44
120.149.20.197
10.90.158.161
$ 
person fge    schedule 11.01.2013

Находить:

(\d+\.\d+\.\d+\.\d+).*

И заменить на:

\1

Скобки зафиксируют эту часть регулярного выражения в переменную с именем \1 (поскольку это первый блок захвата в регулярном выражении). Остальная часть строки не захватывается, а просто выбрасывается операцией замены.

person praseodym    schedule 11.01.2013
comment
Это будет работать, но в основном не требуется: вам вообще не нужно сопоставлять IP-адрес, поскольку вы хотите заменить то, что находится после него (ни с чем). Сопоставить то, что находится после него, намного проще. - person fge; 11.01.2013
comment
Конечно, но я предпочитаю подробный вариант, потому что он оставляет без внимания любой другой текст, который может быть в файле. Воспринимайте это как защитное программирование с помощью регулярных выражений. - person praseodym; 11.01.2013
comment
ОП говорит, что все строки точно такие же, как указано выше. Таким образом, сопоставление IP-адреса бесполезно;) Смотрите мой ответ - person fge; 11.01.2013

Если у вас есть gawk или что-то в этом роде:

gawk "{print $1}" filename

В linux(bash) использование awk будет выглядеть следующим образом:

suku@ubuntu-vm:~$ cat stack 
10.2.57.44      56538154    3028
120.149.20.197  28909678    3166
10.90.158.161   869126135   6025
suku@ubuntu-vm:~$ cat stack | awk '{ print $1 }'
10.2.57.44
120.149.20.197
10.90.158.161
person Suku    schedule 11.01.2013