Как получить N-ное поле цифры c в строке с помощью grep? - PullRequest
0 голосов
/ 02 марта 2020

Как получить второе числовое поле c с помощью grep? Например, есть строка 12 34 56 78, и я хотел бы получить третье число, по которому я могу разделить строку на разные токены:

echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" 

Выходное значение равно

12 
34
56
78

Как выбрать отсюда номер n?

Ответы [ 3 ]

2 голосов
/ 02 марта 2020

Пара возможностей bash, при условии, что вы сделали N=3 (или любое другое поле).

echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" | tail -n+$n | head -n1
echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" | tr '\n' '\t' | cut -f$N

Вы можете легко сделать это в awk, без дополнительных команд оболочки:

echo "ab12 34_56.78" | awk -vN=3 -F'[^[:digit:]]+' '{print $(N+($1==""))}'

-F устанавливает в качестве разделителя полей регулярное выражение, которое соответствует любой последовательности не цифр; добавление ($1=="") к N означает, что перед первым числом нет ни одного non-di git.

Если у вас есть Gnu grep или какая-либо другая реализация grep, которая предлагает PCRE, вы может использовать \K утверждение «сброса точки совпадения»:

echo "ab12 34_56.78" | grep -Po '(?:[[:digit:]]+[^[:digit:]]+){2}\K[[:digit:]]+'

или если вы хотите использовать $N для управления номером совпадения:

echo "ab12 34_56.78" | grep -Po '(?:[[:digit:]]+[^[:digit:]]+){'$((N-1))'}\K[[:digit:]]+'
1 голос
/ 02 марта 2020

С sed:

echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" | sed -n 3p

или

echo "ab12 34_56.78" | sed -E 's/^([^[:digit:]]*[[:digit:]]+){2}[^[:digit:]]+([[:digit:]]+).*/\2/'
0 голосов
/ 02 марта 2020

Использование sed

:>echo "ab12 34_56.78" | sed 's/[^0-9]/\n/g' |  grep -v '^$'
12
34
56
78
:>

[^0-9] --> Any digit other than numbers 0,1,2,3,4,5,6,7,8,9  
\n --> New line char    
^ -- > start of line   
$ --> End of line  

Заменил любой символ, кроме числа, на Новая строка , а затем удалил пустую строку.

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