Остановка регулярных выражений при первом вхождении слова

#regex #bash #regex-greedy

#регулярное выражение #bash #регулярное выражение-жадное

Вопрос:

Как мне изменить мое регулярное выражение, чтобы оно останавливалось после первого совпадения слова?

Мой текст:

 -rwxr--r-- 1 bob123 bob123 0 Nov 10 22:48 /path/for/bob123/dir/to/file.txt
  

Вызывается переменная owner , первый аргумент из cmd:

 owner=$1
  

Мое регулярное выражение: ^.*${owner}

Мое совпадение заканчивается:

 -rwxr--r-- 1 bob123 bob123 0 Nov 10 22:48 /path/for/bob123
  

Но я только хочу, чтобы это было : -rwxr--r-- 1 bob123 .

Ответ №1:

Путем добавления вопросительного знака: ^.*?${owner} . Это сделает * квантификатор нежадным. Но используйте -P option: grep -P для использования регулярных выражений, совместимых с Perl.

https://regex101.com/r/ThGpcq/1 .

Ответ №2:

Здесь вам не нужно регулярное выражение, используйте обработку строк и конкатенацию:

 text='-rwxr--r-- 1 bob123 bob123 0 Nov 10 22:48 /path/for/bob123/dir/to/file.txt'
owner='bob123'
echo "${text%%$owner*}$owner"
# => -rwxr--r-- 1 bob123
  

Посмотрите онлайн-демонстрацию Bash.

${text%%$owner*} Удаляет как можно больше текста с конца строки (из-за %% ) до и включая $owner , и — поскольку $owner текст удален — "...$owner" добавляет $owner обратно.