Как правильно использовать группу захвата регулярных выражений в bash?

#regex #bash #grep

Вопрос:

Я загрузил несколько строк в переменную «результат». Строки выглядят так:

 school/proj_1/file1.txt
school/proj_1/file2.txt
school/proj_1/file3.txt
 

Я стараюсь получить только имя после последней косой черты, так что file1.txt, file2.txt и file3.txt это желаемый результат для меня. Я использую этот фрагмент кода

 for i in $result
do
  grep "school/proj_1/(.*)" $i
done
 

но это не работает. Я чувствую, что регулярное выражение будет работать для Python с созданной мной группой захвата, но я действительно не могу понять, как использовать группы захвата в bash или возможно ли это вообще.

Извините, если это глупый вопрос, я очень новичок в написании сценариев в bash.

Комментарии:

1. С grep помощью , если вы не передадите -E флаг, вам нужно будет экранировать любые символы, которые будут иметь специальное значение регулярного выражения. Поэтому я думаю, что либо grep -E "school/proj_1/(.*)" $i или grep "school/proj_1/(.*)" $i должно сработать.

Ответ №1:

Вы можете использовать простой подход с операцией манипулирования строками:

 echo "${i##*/}"
 

${string##substring}
Удаляет самый длинный матч $substring из переднего ряда $string .

Или используя регулярное выражение в Bash, вы можете получить группы захвата, такие как

 result=("school/proj_1/file1.txt" "school/proj_1/file2.txt" "school/proj_1/file3.txt")
rx='school/proj_1/(.*)'
for i in "${result[@]}"; do
    if [[ "$i" =~ $rx ]]; then
        echo "${BASH_REMATCH[1]}"
    fi
done
 

Смотрите онлайн-демонстрацию. Вот ${BASH_REMATCH[1]} содержимое внутри группы захвата № 1.

Ответ №2:

Попробуй это :

объявление переменной :

 $ result="school/proj_1/file1.txt
school/proj_1/file2.txt
school/proj_1/file3.txt"
 

Команды :

(все как одна строка)

 $ grep -oP "school/proj_1/K.*" "$i" <<< "$result"
 

или

 $ awk -F'/' '{print $NF}' <<< "$result 
 

или

 $ sed 's|.*/||' <<< "$result"
 

или если количество поддиапазонов фиксировано :

 $ cut -d'/' -f3 <<< "$result"
 

Выход :

 file1.txt
file2.txt
file3.txt