usando el nombre de archivo y la ruta como cadenas para ser reemplazadas usando el comando sed

usando el nombre de archivo y la ruta como cadenas para ser reemplazadas usando el comando sed

Estoy tratando de lidiar con la siguiente situación. Tengo muchos archivos (más de 100) con una .htmlextensión en un árbol de carpetas y dentro de esos archivos tengo una cadena que es el nombre del archivo. Por ejemplo tengo los siguientes archivos:

file1.htmlubicado en subfolder1/subfolderA/el que en algún lugar del archivo contiene la cadena file1.html.

file2.htmlubicado en subfolder1/subfolderB/el que en algún lugar del archivo contiene la cadenafile2.html

file3.htmlubicado en subfolder2/subfolderC/el que en algún lugar del archivo contiene la cadena file3.html.

etcétera.

Básicamente, quiero recorrer toda la estructura del árbol, encontrar la cadena que sea idéntica al nombre del archivo y reemplazarla con la ruta + nombre del archivo, eliminando el archivo .html.

Por lo tanto, en el ejemplo anterior, quiero reemplazar:

  • en archivo file1.html:

    reemplazar file1.htmlconsubfolder1/subfolderA/file1

  • en file2.html:

    reemplazar file2.htmlconsubfolder1/subfolderB/file2

  • en archivo3.html:

    reemplazar file3.htmlconsubfolder2/subfolderC/file3

Sé cómo reemplazar cadenas usando findy sed. Usé el siguiente comando:

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

Sin embargo, en ese caso, la "cadena antigua" y la "cadena nueva" deben estar codificadas.

¿Cómo puedo lograr lo anterior con

"cadena antigua" = el nombre del archivo + extensión del archivo

"nueva cadena" = la ruta + nombre del archivo - extensión del archivo

Cualquier ayuda será apreciada.

Respuesta1

Me temo que no puedes hacer lo que especificas con findy execsolo. Intente canalizar findel resultado en un pequeño whilebucle:

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

Respuesta2

Probado y funcionó bien

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

información relacionada