sed не может печатать только соответствующие регулярные выражения - PullRequest
0 голосов
/ 25 октября 2019

У меня есть пара аргументов ключ-значение. Мне нужно распечатать их как есть. Пример.

echo $X
(a=b) (c=d) (e=f)
echo "$X" | sed -E 's/([a-zA-Z0-9_]*=[a-zA-Z0-9_]*)/match/1'
echo "$X" | sed -E 's/([a-zA-Z0-9_]*=[a-zA-Z0-9_]*)/\1/1'
echo "$X" | sed -E 's/([a-zA-Z0-9_]*=[a-zA-Z0-9_]*)/\1/2'
echo "$X" | sed -E 's/([a-zA-Z0-9_]*=[a-zA-Z0-9_]*)/\1/3'

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

Вот мой ожидаемый результат.

a=b
c=d
e=f

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Этот однострочник grep будет делать:

grep -o '[^(]*=[^)]*'

пример:

kent$  grep -o '[^(]*=[^)]*' <<<'(a=b) (c=d) (e=f)' 
a=b
c=d
e=f
1 голос
/ 25 октября 2019

Замените ) ( новой строкой и удалите оставшиеся скобки.

echo "$X" | sed 's/) (/\n/g;s/[()]//g'

Чтобы напечатать $n -ую строку, вы можете направить вывод в

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