Получение разделенных подстрок с помощью sed + regexp - PullRequest
2 голосов
/ 01 июля 2019

Я пытаюсь получить подстроки, используя sed с регулярным выражением.Я хочу получить первое и второе «поля», разделенные символом «:».

Чтобы получить первое поле, я использовал следующую команду, но не знаю, как получить второе поле.

Команда, используемая для получения первого поля:

sed -r -n '1,2 s/([^:]+).*/\1/p' /etc/passwd

Входной файл (пример):

root:x:0:0:root:/root:/bin/bash   
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

Результат команды:

root   
daemon

Но я попытался сделатьполучить первое ("root") и второе ("x") поля (примеры, основанные только на первой строке файла), но я не преуспел.

Я пытался:

sed -r -n '1,2 s/([^:]+).*([^:]+).*/\1 \2/p' /etc/passwd

Результат команды:

root h   
daemon n

Желаемый результат:

root x   
daemon x

Ответы [ 2 ]

1 голос
/ 01 июля 2019

sed использует жадное совпадение . В

sed -r -n '1,2 s/([^:]+).*([^:]+).*/\1 \2/p' /etc/passwd
                        ^^

.* соответствует как можно большему числу символов. Вам нужно

sed -r -n '1,2 s/([^:]+):([^:]+).*/\1 \2/p' /etc/passwd
                        ^

Демо : http://ideone.com/wjL7Za.

Кстати, более простой способ сделать это - использовать cut:

cut -d ":" -f 1,2 --output-delimiter=' ' /etc/passwd

Демо : http://ideone.com/stJdSy.

0 голосов
/ 01 июля 2019

Еще одно выражение, которое вернет желаемый результат, будет:

([a-z]+):([a-z]+).*

RegEx Demo


sed -r -n '1,2 s/([^:]+):([^:]+).*/\1 \2/p'

Sed Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...