我正在使用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)
这显然不是功能完整的,因为我需要帮助,但你知道我希望如何完成它.
您正在寻找的是在正则表达式世界中称为反向引用.您想要返回先前匹配的字符串.
使用sed有两种方法可以做到这一点,但你想要使用的是分组机制:\(
和\)
.什么之间的sed的发现\(
和\)
将投入一组,你可以使用指回到组\n
哪里n
是要使用,由左到右的组数.
所以,在你的例子中,你想要:
sed 's/".*\/\(.\+\.jpg\)"/\1/ig' file
Run Code Online (Sandbox Code Playgroud)
您的文件名将在\(.\+\.jpg\)
组中,然后您可以\1
在替换部分中使用它来引用它.
作为旁注,请注意,只要您不希望shell在引用的字符串中展开变量,就可以使用单引号并避免转义模式中的双引号.
归档时间: |
|
查看次数: |
2178 次 |
最近记录: |