Keywords in Datei suchen und verarbeiten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
weshalb
Beiträge: 1271
Registriert: 16.05.2012 14:19:49

Keywords in Datei suchen und verarbeiten

Beitrag von weshalb » 10.02.2020 10:40:33

Hallo, ich versuche gerade, bestimmte Einträge in Dateien zu finden und weiter zuverarbeiten.
Von dem Eintrag hier benötige ich die 2018 und möchte diese gerne am Anfang der xml Datei inkl. einem Wort davor als Zeile einfügen.

Code: Alles auswählen

<Date Value="19.10.2018" />
Auslesen kann ich schonmal>

Code: Alles auswählen

sed -n -e 's/.*<Date Value="......\(.*\)".*\/>.*/\1/p' test.xml
Doch ich weiß nun nicht, wie es weitergehen soll.

Hat jemand eventuell eine Idee? Das würde mich sehr freuen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Keywords in Datei suchen und verarbeiten

Beitrag von Meillo » 10.02.2020 11:37:32

weshalb hat geschrieben: ↑ zum Beitrag ↑
10.02.2020 10:40:33
Von dem Eintrag hier benötige ich die 2018 und möchte diese gerne am Anfang der xml Datei inkl. einem Wort davor als Zeile einfügen.
Wie meinst du das genau? Eine XML-Datei beginnt doch immer mit ``<?xml'', davor solltest du nichts einfuegen.

Bitte poste ein Minimalbeispiel vom Zustand der Datei davor und dem gewuenschten Zielzustand. Dann koennen wir uns das besser vorstellen und wir haben Testdaten mit denen wir arbeiten koennen.
Use ed once in a while!

Benutzeravatar
weshalb
Beiträge: 1271
Registriert: 16.05.2012 14:19:49

Re: Keywords in Datei suchen und verarbeiten

Beitrag von weshalb » 10.02.2020 11:57:21

Hallo, in meinem Fall soll das tatsächlich an den Anfang

Orig:

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8"?>
    <Configuration>
        <Filename Value="test.xml" />
        <Version Value="1.0" />
        <Date Value="19.10.2018" />
        <Time Value="14:19:32" />
Danach:

Code: Alles auswählen

Running;2018
<?xml version="1.0" encoding="utf-8"?>
    <Configuration>
        <Filename Value="test.xml" />
        <Version Value="1.0" />
        <Date Value="19.10.2018" />
        <Time Value="14:19:32" />

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Keywords in Datei suchen und verarbeiten

Beitrag von Meillo » 10.02.2020 12:14:40

Danke!


Hier eine Umsetzung mit ed(1), die die Ausgangsdatei veraendert:

Code: Alles auswählen

#!/bin/sh

text="Running;"
year=`sed -n -e 's/.*<Date Value="......\(.*\)".*\/>.*/\1/p' "$1"`

ed - "$1" <<!
1i
$text$year
.
w
q
!
Die XML-Datei ist danach natuerlich nicht mehr valide!

Entfernen kannst du die erste Zeile wieder so:

Code: Alles auswählen

#!/bin/sh

ed - "$1" <<!
1d
w
q
!
Use ed once in a while!

Benutzeravatar
weshalb
Beiträge: 1271
Registriert: 16.05.2012 14:19:49

Re: Keywords in Datei suchen und verarbeiten

Beitrag von weshalb » 10.02.2020 16:09:23

Danke Mailo, danke schonmal doch das klappt bei mir nicht.

Code: Alles auswählen

#!/bin/sh

text="Running;"
year=`sed -n -e 's/.*<Date Value="......\(.*\)".*\/>.*/\1/p' "$1"`

ed - "$1" <<!
1i
$text$year
.
w
q
!
Wo kann ich jetzt den Pfad angeben? Er sagt mir
sed: kann nicht gelesen werden: Datei oder Verzeichnis nicht gefunden.
Zeile 6: ed Kommando nicht gefunden.
Ich habe bereits ohne Erfolg versucht, innerhalb von Sed den Pfad dazwischen zu quetschen.

Edit: ED habe ich inzwischen installiert. Bleibt die Sache mit dem Pfad.

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Keywords in Datei suchen und verarbeiten

Beitrag von eggy » 10.02.2020 16:46:12

Versuch mit awk

Code: Alles auswählen

awk -F'[".]' '/<Date Value=/{fundstelle= $4;} {rest=rest "\n" $0 } END{print "Running;" fundstelle  rest}' test.txt
-F'[abc]' bedeutet jedes der genannten Zeichen abc gilt als Feldtrenner, d.h in dem obrigen Fall sind Anführungszeichen oder Punkt Feldtrenner, warum die? Im Text direkt links bzw rechts von der 2018 zu finden.
Dann /<Date Value=/ das findet nur die Zeilen, die das entsprechende Muster haben, hier merkt awk sich jetzt Feld 4 im Fund, via $Zahl kann man die einzelnen Felder nutzen, $4 sollte 2018 ergeben.
Hat man die {} ohne vorangestelltes Muster, wird einfach jede Zeile komplett bearbeitet, hier wird sie an den schon bekannten Rest angehängt, $0 ist die vollständige Zeile.
Und wenn alles aus der Datei eingelesen wurde, gibt man via END noch einmalig das Wort und die gemerkten Sachen aus.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Keywords in Datei suchen und verarbeiten

Beitrag von Meillo » 10.02.2020 16:49:30

weshalb hat geschrieben: ↑ zum Beitrag ↑
10.02.2020 16:09:23
sed: kann nicht gelesen werden: Datei oder Verzeichnis nicht gefunden.
Hast du das Script mit dem Dateinamen der XML-Datei als Parameter aufgerufen (das haette ich dazu sagen sollen)?

Ich hab's bei mir lokal getestet und es hat funktioniert. Es ist also getesteter Code, den ich gepostet habe ... aber er faengt keine Fehler ab. ;-)
Use ed once in a while!

Benutzeravatar
weshalb
Beiträge: 1271
Registriert: 16.05.2012 14:19:49

Re: Keywords in Datei suchen und verarbeiten

Beitrag von weshalb » 11.02.2020 13:55:57

eggy hat geschrieben: ↑ zum Beitrag ↑
10.02.2020 16:46:12
Versuch mit awk

Code: Alles auswählen

awk -F'[".]' '/<Date Value=/{fundstelle= $4;} {rest=rest "\n" $0 } END{print "Running;" fundstelle  rest}' test.txt
-F'[abc]' bedeutet jedes der genannten Zeichen abc gilt als Feldtrenner, d.h in dem obrigen Fall sind Anführungszeichen oder Punkt Feldtrenner, warum die? Im Text direkt links bzw rechts von der 2018 zu finden.
Dann /<Date Value=/ das findet nur die Zeilen, die das entsprechende Muster haben, hier merkt awk sich jetzt Feld 4 im Fund, via $Zahl kann man die einzelnen Felder nutzen, $4 sollte 2018 ergeben.
Hat man die {} ohne vorangestelltes Muster, wird einfach jede Zeile komplett bearbeitet, hier wird sie an den schon bekannten Rest angehängt, $0 ist die vollständige Zeile.
Und wenn alles aus der Datei eingelesen wurde, gibt man via END noch einmalig das Wort und die gemerkten Sachen aus.
Danke schonmal.

Code: Alles auswählen

awk -F'["./]' '/<Date Value=/{fundstelle= $4;} {rest=rest "\n" $0 } END{print "Running;" fundstelle  rest}' test.txt
Hatte dann gut geklappt, ein Schrägstricht fehlte. Und wie bekomme ich das nun die die gleiche Datei geschrieben?


Ziel ist eigentlich es, dass ein Script bestimmte Dateien in bestimmte Ordner kopiert und danach die Zeile oben einfügt und auch nur dann, wenn die noch nicht dasteht.

@Mailo

Besser wäre es schon, wenn ich innherhalb der Datei die Pfade angeben kann.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Keywords in Datei suchen und verarbeiten

Beitrag von Meillo » 11.02.2020 15:13:47

weshalb hat geschrieben: ↑ zum Beitrag ↑
11.02.2020 13:55:57
Ziel ist eigentlich es, dass ein Script bestimmte Dateien in bestimmte Ordner kopiert und danach die Zeile oben einfügt und auch nur dann, wenn die noch nicht dasteht.
Hier eine ausgebaute Version:

Code: Alles auswählen

#!/bin/sh

file="$1"
text="Running;"

if [ -z "$file" ]; then
        echo "Keine Datei angegeben" >&2
        exit 1
fi

if [ "`sed '1s,;.*,;,;q' "$file"`" = "$text" ]; then
        echo "Eintrag schon vorhanden" >&2
        exit 2
fi

year=`sed -n -e 's/.*<Date Value="......\(.*\)".*\/>.*/\1/p' "$file"`

ed - "$file" <<!
1i
$text$year
.
w
q
!
@Mailo
Meillo ;-)
Besser wäre es schon, wenn ich innherhalb der Datei die Pfade angeben kann.
Kannst du haben, wenn du beim Setzen der Variable `file' das `$1' durch deinen Dateinamen ersetzt.

Falls es sich um mehrere Dateien handelt, dann loese es mit einer Shellschleife drum rum:

Code: Alles auswählen

for i in /path/to/*; do
	obiges-script "$i"
done
... das kannst du ja wiederum in ein Script verpacken, wenn du willst. Oder eben alles zu einem verwurst. (Kannst du soviel Shellprogrammieren, dass du das hinkriegst?)
Use ed once in a while!

Antworten