sedコマンドを使用して置換する文字列としてファイル名とパスを使用する

sedコマンドを使用して置換する文字列としてファイル名とパスを使用する

私は次のような状況に対処しようとしています。フォルダー ツリーに拡張子を持つファイルが多数 (100 個以上) あり.html、それらのファイル内にはファイル名である文字列があります。たとえば、次のファイルがあります。

file1.htmlsubfolder1/subfolderA/ファイル内のどこかに文字列 が含まれていますfile1.html

file2.htmlsubfolder1/subfolderB/ファイル内のどこかに文字列が含まれているfile2.html

file3.htmlsubfolder2/subfolderC/ファイル内のどこかに文字列 が含まれていますfile3.html

等々。

基本的には、ツリー構造全体を調べて、ファイル名と同じ文字列を見つけ、それをパス + ファイル名に置き換えて、.html.

したがって、上記の例では、次のものを置き換えます。

  • ファイル内file1.html:

    file1.htmlと置換するsubfolder1/subfolderA/file1

  • file2.html

    file2.htmlと置換するsubfolder1/subfolderB/file2

  • file3.html 内:

    file3.htmlと置換するsubfolder2/subfolderC/file3

findおよびを使用して文字列を置換する方法は知っていますsed。次のコマンドを使用しました。

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

ただし、その場合、「古い文字列」と「新しい文字列」をハードコードする必要があります。

上記を実現するにはどうすればいいでしょうか

「古い文字列」 = ファイル名 + ファイル拡張子

「新しい文字列」 = パス + ファイル名 - ファイル拡張子

どのような助けでも大歓迎です。

答え1

残念ながら、 と だけでは指定した操作は実行できませんfindexecfind結果を小さな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

関連情報