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

findあなたは割り当てられたことを一人ではできないようですexecfindパイプの結果を小さなループに入れてみてください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

関連情報