Назад | Перейти на главную страницу

sed / awk: извлечь одно число из строки

У меня есть много таких строк, которые возвращаются из команды bash с разными sourceNodeIds разной длины цифр:

<NodeAssociation sourceNodeId="33654" [...] sourceNodeEntity="Issue" />

Я хотел бы передать его в sed или awk и просто вернуть номер nnnn из sourceNodeId="nnnn"

что-то вроде:

cat blah | sed 's/.+?sourceNodeId="\(\d+\)".+/\1/'

но это не работает. Я использую Mac, если это имеет значение (я думаю, что версия sed может быть другой). Я знаю регулярные выражения Perl, но я думаю, что sed ожидает другого вида.

Спасибо!!!

sed не знает о \d и не жадные совпадения. Вам не нужно использовать cat. Это должно работать:

sed 's/.*sourceNodeId="\([0-9]\+\)".*/\1/' file

Некоторые sed версии придирчивы к желанию -e (будет работать, даже если это не требуется):

sed -e 's/.*sourceNodeId="\([0-9]\+\)".*/\1/' file

Если ваш sed поддерживает -r вы можете пропустить экранирование:

sed -er 's/.*sourceNodeId="([0-9]+)".*/\1/' file

Также работает:

cat blah | cut -f2 -d\"