usando nome de arquivo e caminho como strings a serem substituídas usando o comando sed

usando nome de arquivo e caminho como strings a serem substituídas usando o comando sed

Estou tentando lidar com a seguinte situação. Tenho muitos arquivos (mais de 100) com .htmlextensão em uma árvore de pastas e dentro desses arquivos tenho uma string que é o nome do arquivo. Por exemplo tenho os seguintes arquivos:

file1.htmllocalizado em subfolder1/subfolderA/algum lugar do arquivo que contém a string file1.html.

file2.htmllocalizado em subfolder1/subfolderB/algum lugar do arquivo que contém a stringfile2.html

file3.htmllocalizado em subfolder2/subfolderC/algum lugar do arquivo que contém a string file3.html.

e assim por diante.

Basicamente, quero percorrer toda a estrutura em árvore, encontrar a string que é idêntica ao nome do arquivo e substituí-la pelo caminho + nome do arquivo, removendo a extensão .html.

Portanto, no exemplo acima, quero substituir:

  • no arquivo file1.html:

    substituir file1.htmlcomsubfolder1/subfolderA/file1

  • em file2.html:

    substituir file2.htmlcomsubfolder1/subfolderB/file2

  • no arquivo3.html:

    substituir file3.htmlcomsubfolder2/subfolderC/file3

Eu sei como substituir strings usando finde sed. Usei o seguinte comando:

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

No entanto, nesse caso, "string antiga" e "nova string" precisam ser codificadas.

Como posso conseguir o que foi dito acima com

"string antiga" = nome do arquivo + extensão do arquivo

"nova string" = caminho + nome do arquivo - extensão do arquivo

Qualquer ajuda será muito apreciada.

Responder1

Receio que você não possa fazer o que especifica findsozinho exec. Experimente findo resultado de piping em um pequeno whileloop:

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

Responder2

Testado e funcionou bem

#!/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

informação relacionada