Verwenden von Dateiname und Pfad als Zeichenfolgen, die mit dem Befehl sed ersetzt werden sollen

Verwenden von Dateiname und Pfad als Zeichenfolgen, die mit dem Befehl sed ersetzt werden sollen

Ich versuche, mit der folgenden Situation umzugehen. Ich habe viele Dateien (mehr als 100) mit einer .htmlErweiterung in einem Ordnerbaum und innerhalb dieser Dateien habe ich eine Zeichenfolge, die der Dateiname ist. Beispielsweise habe ich die folgenden Dateien:

file1.htmlbefindet sich an subfolder1/subfolderA/einer Stelle in der Datei, an der sich die Zeichenfolge befindet file1.html.

file2.htmlbefindet sich in subfolder1/subfolderB/der irgendwo in der Datei befindet sich die Zeichenfolgefile2.html

file3.htmlbefindet sich an subfolder2/subfolderC/einer Stelle in der Datei, an der sich die Zeichenfolge befindet file3.html.

und so weiter.

Grundsätzlich möchte ich die gesamte Baumstruktur durchgehen, die Zeichenfolge finden, die mit dem Dateinamen identisch ist, und sie durch den Pfad + Dateinamen ersetzen und dabei die entfernen .html.

Daher möchte ich im obigen Beispiel Folgendes ersetzen:

  • im Ordner file1.html:

    ersetzen file1.htmlmitsubfolder1/subfolderA/file1

  • In file2.html:

    ersetzen file2.htmlmitsubfolder1/subfolderB/file2

  • in Datei3.html:

    ersetzen file3.htmlmitsubfolder2/subfolderC/file3

findIch weiß, wie man Zeichenfolgen durch und ersetzt sed. Ich habe den folgenden Befehl verwendet:

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

In diesem Fall müssen jedoch „alter String“ und „neuer String“ fest codiert werden.

Wie kann ich das oben genannte erreichen mit

"alter String" = der Dateiname + Dateierweiterung

"neuer String" = Pfad + Dateiname - Dateierweiterung

Jede Hilfe wird sehr geschätzt.

Antwort1

Ich fürchte, Sie können das, was Sie angeben, nicht allein mit findund tun exec. Versuchen Sie, finddas Ergebnis von in eine kleine whileSchleife zu leiten:

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

Antwort2

Getestet und funktionierte gut

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

verwandte Informationen