У меня есть шаблон регулярного выражения, который должен совпадать в нескольких местах в строке. Я хочу, чтобы все группы соответствия были в одном массиве, а затем печатали каждый элемент.Bash regex ungreedy match
Итак, я пытался это:
#!/bin/bash
f=$'\n\tShare1 Disk\n\tShare2 Disk\n\tPrnt1 Printer'
regex=$'\n\t(.+?)\\s+Disk'
if [[ $f =~ $regex ]]
then
for match in "${BASH_REMATCH[@]}"
do
echo "New match: $match"
done
else
echo "No matches"
fi
Результат:
New match:
Share1 Disk
Share2 Disk
New match: Share1 Disk
Share2
Ожидаемый результат был бы
New match: Share1
New match: Share2
Я думаю, что это не работает, потому что мой .+?
соответствует жадным. Поэтому я посмотрел, как это можно сделать с помощью rexx bash. Но все, кажется, предлагают использовать grep с регулярным выражением perl.
Но, безусловно, должен быть другой способ. Я думал, может быть что-то вроде [^\\s]+
.. Но выход для этого был:
New match:
Share1 Disk
New match: Share1
... Любые идеи?
одна идея будет использовать '[^ \\ s] +' вместо этого? '. +?'. Это будет соответствовать символам до пробела, если будет найден. – Rahul
@Rahul или '\ S +?' –
Оба дают тот же результат, что и '[^ \\ s] +', о котором я уже упоминал в моем вопросе. Я не думаю, что '?' Поддерживается даже в bash, я имею в виду в этом контексте. Я имею в виду, что '' 'за' + 'обычно означает' match ungreedy'. – Forivin