繁体   English   中英

重击,查找和替换-重复使用变量?

[英]Bash, find and replace - re-use with variable?

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

问题是我正在使用sed替换包含(在此示例中) “ / some / random / directory / image.jpg”的所有实例

“ some / random / directory / image.jpg”每次都会有所不同,因此,在我的sed行中,我需要使用正则表达式,但是要找到要替换的行,我需要包含image.jpg

因此,例如,我的s​​ed行将类似于

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

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

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

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

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

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

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


另外,请注意,只要您不希望外壳程序在带引号的字符串中扩展变量,就可以使用单引号,并避免在模式中转义双引号。

使用括号捕获匹配项,然后使用反斜杠对其进行引用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM