#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.
Ответ №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
обратно.