簡體   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