我已经将一些字符串加载到变量“result”中。字符串看起来像这样:
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编写脚本。
答案 0 :(得分:3)
试试这个:
$ result="school/proj_1/file1.txt
school/proj_1/file2.txt
school/proj_1/file3.txt"
(全部为 one-liners )
$ 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
答案 1 :(得分:2)
您可以使用string manipulation操作的简单方法:
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
请参阅online demo。这里,${BASH_REMATCH[1]}
是捕获组#1内的内容。