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

时间:2012-06-03 19:29:52

标签: regex bash sed

我正在用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

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

2 个答案:

答案 0 :(得分:5)

在正则表达式的世界中,您所寻找的内容称为 反向引用 。您希望引用回先前匹配的字符串。

有两种方法可以使用sed执行此操作,但您要使用的是分组机制:\(\)。在\(\)之间找到的任何内容都将被放入一个组中,您可以使用\n返回该组,其中n是您想要的组的编号使用,从左到右。

因此,在您的示例中,您需要:

sed 's/".*\/\(.\+\.jpg\)"/\1/ig' file

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


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

答案 1 :(得分:3)

使用括号捕获匹配项,然后使用反斜杠引用它。

sed -e 's/".*\/\(.*.jpg\)/\1/ig'