#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