使用檔案名稱和路徑作為要使用 sed 命令替換的字串

使用檔案名稱和路徑作為要使用 sed 命令替換的字串

我正在嘗試處理以下情況。我在資料夾樹中有許多帶有擴展名的檔案(超過 100 個).html,在這些檔案中我有一個字串,即檔案名稱。例如我有以下文件:

file1.html位於subfolder1/subfolderA/檔案中包含字串的某個位置file1.html

file2.html位於subfolder1/subfolderB/檔案中包含該字串的某個位置file2.html

file3.html位於subfolder2/subfolderC/檔案中包含字串的某個位置file3.html

等等。

基本上,我想遍歷整個樹狀結構,找到與文件名相同的字串,並將其替換為路徑+文件名,刪除.html.

因此,在上面的例子中,我想替換:

  • 在文件中file1.html

    file1.htmlsubfolder1/subfolderA/file1

  • file2.html

    file2.htmlsubfolder1/subfolderB/file2

  • 在 file3.html 中:

    file3.htmlsubfolder2/subfolderC/file3

我知道如何使用find和替換字串sed。我使用了以下命令:

find . -type f -name \*.html -exec sed -i.bak 's|<old string>|<new string>|g' {} +

但是,在這種情況下,「舊字串」和「新字串」需要進行硬編碼。

我怎樣才能實現上述目標

“舊字串”= 檔案名稱 + 檔案副檔名

“新字串”=路徑+檔案名稱-檔案副檔名

任何幫助將不勝感激。

答案1

恐怕你無法單獨完成你指定的find事情exec。嘗試將管道find的結果放入一個小循環中while

find . -type f -name \*.html | while read PN; do sed "s|${PN##*/}|${PN%.*}|g" "$PN"; done

答案2

測試並運行良好

#!/bin/bash
echo "enter the input"
read p
cd $p
echo "enter the file"
read f
if [[ -f $p/$f ]]
then
echo "file exsists"

grep -io "$f" $p/$f >/dev/null
if [[ $? == 0 ]]
then
r=`echo $f | sed "s/\.txt//g"`
echo $r
awk -v f="$f" -v r="$r" '{gsub(f,r,$0);print }' $f 
fi
fi

相關內容