staging.inyokaproject.org

sed suchen und ersetzen nur in bestimmter Zeile funktioniert nicht

Status: Gelöst | Ubuntu-Version: Ubuntu 15.10 (Wily Werewolf)
Antworten |

petra_78

Anmeldungsdatum:
25. Juni 2016

Beiträge: Zähle...

Hallo Forum,

nach langem Probieren man- und Such-Seiten lesen komm ich nicht weiter und weiß nicht woran es liegt.

Problem:

1
sed '#suchstring#s#anderer_suchstring#ersetzung#g' textdatei

geht nicht (es kommt keine Fehlermeldung aber auch keine Aktion, in der Textdatei finden sich keine Änderungen)

Der suchstring existiert, denn folgendes geht:

1
grep suchstring textdatei | sed 's#anderer_suchstring#ersetzung#g'

Auch das Wechseln der Trennzeichen oder der einfachen in doppelte Anführungszeichen bringt nix. Der Suchstring beinhaltet keine Sonderzeichen oder Ähnliches.

Die eigentliche Aufgabe:

In einem Verzeichnis liegen an die 1000 konvertierte Dateien (das Konvertierungstool kann nicht rekursiv arbeiten) die über das gesamte lokale Dateisystem verteilt waren.

Es gibt eine Textdatei in der die absoluten Pfade (mit den Dateinamen) zu den unkonvertierten Dateien stehen (Pfadliste) und eine Datei mit den Dateinamen der konvertierten Dateien (Dateiliste). Die Dateien besitzen unterschiedliche Endungen aber der Name vor dem Punkt ist gleich.

Idee:

  1. suche in der Pfadliste die Zeile mit einer Übereinstimmung aus der Dateiliste (Endungen abgeschnitten)(die Dateiliste hat keine Dopplungen)

  2. ergänze den Zeilenanfang mit cp ./Dateinamen.Endung und Leerzeichen und am Zeilenende tausche die Endung von abc zu ftg und das alles in eine neue Textdatei2 schreiben

Ergebnis ist eine Textdatei2 mit Zeilen in dieser Form:

1
cp ./konvertierte.Datei /alte/Pfad/angabe/konvertierte.Datei

dann kann die Textdatei2 als script abgearbeitet werden

Warum geht die Zeile sed '#suchstring#s#anderer_suchstring#ersetzung#g' nicht?

Ich bedanke mich schon mal für eure Mühen.

Petra

Bearbeitet von sebix:

Forensyntax und Groß-/Kleinschreibung eingefügt. Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Schritt für Schritt:

sed '/foo/ s/hallo/welt/'       # Funktioniert
sed '/foo/ s#hallo#welt#'       # Funktioniert
sed '#foo# s#hallo#welt#'       # Funktioniert nicht

Warum? Er interpretiert das an der Stelle als Kommentar. Du brauchst einen Backslash, wenn du den Delimiter eines „Adressen-Regex“ ändern willst:

sed '\#foo# s#hallo#welt#'

Wird so auch in der Manpage erwähnt (zumindest in meiner):

       \cregexpc
              Match lines matching the regular expression regexp.  The
              c may be any character.

(– edit: Whoops, Großteil des Postings verlorengegangen.)

petra_78

(Themenstarter)

Anmeldungsdatum:
25. Juni 2016

Beiträge: 5

danke für die schnelle Antwort! und vor allem auch für die Erklärung.

den / hatte ich auch ausprobiert, allerdings hatte ich (wie ich in der history sehen konnte) genau bei diesem Versuch einen Tippfehler im Suchstring, dann klappt es auch nicht mit der richtigen Schreibweise, meine es klappt schon aber es fällt nicht auf, dass es geklappt hat ...

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Hi Petra,

zuerst mal willkommen hier auf dem Forum !

Wie herum brauchst Du die Umwandlung der Dateipfade eigentlich ? - kannst Du nicht einfach mit find die ganzen Originaldateien nochmal suchen, und dann aus den Pfaden die Dateinamen im Sammelverzeichnis ableiten ?
Das ginge nämlich recht hübsch direkt mit ein paar Parameter Expansions:

1
find -name "*.alt" -exec bash -c 'datei="${0##*/}"; echo cp "${datei%%.*}.neu" "${0%/*}/"' {}  \;

Dann wärst Du überhaupt das ganze Gebastel mit den Dateilisten los ...

LG,

track

petra_78

(Themenstarter)

Anmeldungsdatum:
25. Juni 2016

Beiträge: 5

Danke für die Begrüßung.

Ich hab es so gelöst:

1
2
3
4
5
6
7
8
#!/bin/bash
while read zeile

do

sed -n '\#.*\/'${zeile%.*}'\....# {s#^#cp -b \.\/'$zeile' #g;s#...$#'${zeile##*.}'#gp}' pfadliste

done < ./dateiliste > cp_Liste

ist das das gleiche wie du geschrieben hast (bis auf das deins gleich den cp Befehl umsetzt)? und was heißt "${0##*/}" und "${0%/*}/" in diesem zusammenhang?

Bearbeitet von rklm:

Syntaxhighlighting

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Dein wildes 'Qu'oti'ng' in der sed-Zeile ist wirklich gefährlich ! - da kannst Du sonst was für Dateien erwischen.

Außerdem solltest Du nie vergessen, dass "#", TAB und Zeilenimbrüche in Dateinamen grundsätzlich erlaubt sind.
Gegen all das ist mein Vorschlag genau deshalb immun, weil er 'sauber "gequotet" ' ist (natürlich: über 2 Ebenen !)

Mit solchen handwerklichen Details steht und fällt jedes Skript. (und ja, ich weiß, wie viel Mist die Allwissende Müllhalde zu diesem Thema schreibt !)

- im Nachbarstrang bin ich auf Dein Skript auch schon eingegangen ... 😉

LG,

track

Antworten |