Я пытаюсь разобраться со следующей ситуацией. У меня есть много файлов (более 100) с .html
расширением в дереве папок, и внутри этих файлов у меня есть строка, которая является именем файла. Например, у меня есть следующие файлы:
file1.html
расположен в subfolder1/subfolderA/
котором где-то в файле содержится строка file1.html
.
file2.html
находится в subfolder1/subfolderB/
котором где-то в файле содержится строкаfile2.html
file3.html
расположен в subfolder2/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
and 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