Bash,查找和替换 - 重用变量?

Sco*_*ley 1 regex bash sed

我正在使用bash构建一个脚本,并查找对其他文件的引用(例如html文件中的引用为img源(image.jpg)

问题是我使用sed替换包含的所有实例(在本例中)"/some/random/directory/image.jpg"

"一些/随机/目录/ image.jpg文件"将被differen每一次,所以当涉及到我的sed行我需要使用正则表达式,但为了找到行取代我需要包括image.jpg的.

所以例如我的sed线会是这样的

sed 's/\/some\/random\/directory\/image.jpg/images\/image.jpg/g'
Run Code Online (Sandbox Code Playgroud)

但是,如何在查找中找到最终结果并将其置于替换中?(在这个例子中它将是image.jpg.有没有办法让它成为一个变量?

这是我现在的脚本:

#!/bin/bash

cd /home/username/www/immrqbe/

for file in $(grep -rlI ".jpg" *)
do
sed -e "s/\".*\/.*.jpg//ig" $file > /tmp/tempfile.tmp
mv /tmp/tempfile.tmp /home/username/www/immrqbe/$file
done
Run Code Online (Sandbox Code Playgroud)

这显然不是功能完整的,因为我需要帮助,但你知道我希望如何完成它.

Tim*_*ote 5

您正在寻找的是在正则表达式世界中称为反向引用.您想要返回先前匹配的字符串.

使用sed有两种方法可以做到这一点,但你想要使用的是分组机制:\(\).什么之间的sed的发现\(\)将投入一组,你可以使用指回到组\n哪里n是要使用,由左到右的组数.

所以,在你的例子中,你想要:

sed 's/".*\/\(.\+\.jpg\)"/\1/ig' file
Run Code Online (Sandbox Code Playgroud)

您的文件名将在\(.\+\.jpg\)组中,然后您可以\1在替换部分中使用它来引用它.


作为旁注,请注意,只要您不希望shell在引用的字符串中展开变量,就可以使用单引号并避免转义模式中的双引号.