如何在bash中正确使用正则表达式捕获组?

时间:2018-03-07 14:00:36

标签: regex bash grep

我已经将一些字符串加载到变量“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编写脚本。

2 个答案:

答案 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内的内容。