использование имени файла и пути в качестве строк для замены с помощью команды 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

Боюсь, вы не сможете сделать то, что указали, с помощью findand 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

Связанный контент