我正在用bash构建一个脚本,并找到对其他文件的引用(例如html文件中的引用到img源(image.jpg)
问题是我使用sed替换所有包含的实例(在本例中)“/ some / random / directory / image.jpg”
“some / random / directory / image.jpg”每次都会有所不同,所以说到我的sed行我需要使用正则表达式,但为了找到要替换的行我需要包含 image.jpg 。
所以例如我的sed行就像是
sed 's/\/some\/random\/directory\/image.jpg/images\/image.jpg/g'
但是如何在查找中找到最终结果并将其置于替换中? (在这个例子中它将是 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
这显然不是功能完整的,因为我需要帮助,但你知道我希望如何完成它。
答案 0 :(得分:5)
在正则表达式的世界中,您所寻找的内容称为 反向引用 。您希望将引用回先前匹配的字符串。
有两种方法可以使用sed执行此操作,但您要使用的是分组机制:\(
和\)
。在\(
和\)
之间找到的任何内容都将被放入一个组中,您可以使用\n
返回该组,其中n
是您想要的组的编号使用,从左到右。
因此,在您的示例中,您需要:
sed 's/".*\/\(.\+\.jpg\)"/\1/ig' file
您的文件名将位于\(.\+\.jpg\)
群组中,然后您可以在替换部分使用\1
引用该文件名。
作为旁注,请注意,只要您不希望shell扩展引用字符串中的变量,就可以使用单引号并避免转义模式中的双引号。
答案 1 :(得分:3)
使用括号捕获匹配项,然后使用反斜杠引用它。
sed -e 's/".*\/\(.*.jpg\)/\1/ig'