1

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

但是我如何得到 find 中的内容的结尾并将其放入替换中?(在这个例子中,它是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

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

4

2 回答 2

5

您正在寻找的东西在正则表达式的世界中被称为反向引用。您想引用以前匹配的字符串。

使用 sed 有几种方法可以做到这一点,但您要使用的是分组机制:\(\). sed 在两者之间找到的任何内容\(\)将被放入一个组中,您可以使用\nwheren是您要使用的组的编号从左到右引用该组。

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

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

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


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

于 2012-06-03T21:33:37.847 回答
3

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

sed -e 's/".*\/\(.*.jpg\)/\1/ig'
于 2012-06-03T19:55:53.680 回答