[geklärt - nicht lösbar - Workaround] ed im Script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

[geklärt - nicht lösbar - Workaround] ed im Script

Beitrag von k2 » 10.01.2019 20:15:49

Hallo zusammen,

ich habe ein kleines Problemchen mit ed, da er etwas störrischer ist als sed.

Code: Alles auswählen

ed -v -s ${datei} <<EOF
/<ul class="menu">/,/<\/ul><!--menu-->/s/<a href=".\//<a href=".\/..\//g
wq
EOF
Soll heißen:
in der Datei ${datei}
ersetze im Bereich von <ul class="menu"> bis </ul><!--menu-->
<a href="./ durch <a href="./../
so oft wie es vorkommt /g
schreiben und beenden wq

So weit, so gut - das funktioniert auch so - solange es etwas zu ersetzen gibt. Wird nichts ersetzt, bricht ed ab. Mir ist bekannt, dass ed mit einer Fehlermeldung abbricht, wenn er eine Ersetzung nicht durchführen kann. Jedoch ging ich davon aus, dass mit der Abfrage des Bereiches <ul class="menu"> bis </ul><!--menu--> eine bedingte Ersetzung durchgeführt wird. Anscheinend ist das nicht so.

Wie kann ich den Abbruch vermeiden?
Die genaue Fehlermeldung lautet übrigens: script, line 1: No match

Grüße und Danke schon einmal
Zuletzt geändert von k2 am 18.01.2019 11:55:47, insgesamt 2-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: ed im Script

Beitrag von heisenberg » 10.01.2019 20:28:53

sed kann das auch. Der bricht wahrscheinlich nicht ab.

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

Re: ed im Script

Beitrag von Meillo » 10.01.2019 20:47:42

Habe ich da ``ed'' gehoert? :-D :THX:


Ich bin mir nicht sicher, was du meinst, wenn du schreibst, dass ed abbrechen wuerde? Mein ed bricht nicht ab. Ich wuesste nicht, dass ed abbrechen im Sinne von Programm beenden wuerde. Er sagt nur ``?'' immer dann wenn er etwas seltsam findet. Keine Ersetzung machen zu koennen, wenn er eine machen soll, findet er seltsam. Aber abbrechen/beenden sollte er nicht.

Wenn ich nach der nicht moeglichen Ersetzung speichere und beende, beendet er normal erfolgreich:

Code: Alles auswählen

:-Q ed /tmp/a
257
/xxx/,/yyy/s/aaa/bbb/g
?
H
search string not found
w
257
q

:-Q echo $?      
0
Mein ed ist allerdings ein Heirloom ed und kein GNU ed. (Darum habe ich auch die Fehlermeldung explizit mit `H' ausgegeben.)



Vielleicht kannst du nochmal genau beschreiben, wie sich das Abbrechen bei dir aeussert. Wenn es nur um die Meldung geht, dann kannst du die einfach ignorieren. Vielleicht koenntest du im GNU ed auch mal `-l' versuchen.
Use ed once in a while!

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Re: ed im Script

Beitrag von k2 » 10.01.2019 23:19:19

Hallo zusammen

@heisenberg: sed bricht nicht ab, das stimmt. Allerdings möchte ich sed aus dem Script raushalten und versuche ihn durch ed zu ersetzen.

@Meillo: Mein ed (GNU Ed 1.10) bricht die Bearbeitung ab. Habe es gerade noch einmal getestet: ein darauffolgendes Append wird nicht mehr ausgeführt. Das Ed-aufrufende Shellscript läuft natürlich weiter.

Code: Alles auswählen

ed -v -s ${datei} <<EOF
/<ul class="menu">/,/<\/ul><!--menu-->/s/<a href=".\//<a href=".\/..\//g
a
Ed bricht nicht ab
.
wq
EOF
echo $?
Ed gibt einen Wert von 1 zurück ($?) und mit -v aktiviert die Fehlermeldung: script, line 1: No match
Witzigerweise funktioniert
-l, --loose-exit-status
exit with 0 status even if a command fails
auch nicht wie in der Man-Page beschrieben; ebenfalls Exit-Code 1.

Ist nicht ganz so tragisch, denn wenn ed nichts ersetzen muss - dann kann er sich auch beenden. Der Funktion des Scripts tut das nichts. Allerdings nicht schön und ziemlich dirty, außerdem leite ich die Ausgabe evt. noch in ein Log-File um und dann steht da bei jedem bearbeiteten Unterverzeichnis ggf. ein "?".

Vielleicht macht es ja noch KLICK. In http://wiki.bash-hackers.org/howto/edit-ed ist der Fall so beschrieben:
Pitfalls
...
an error stops the script
...
If you want the same behaviour you can use g/foo/ to trick ed. g/foo/ will apply the command on all lines matching foo, thus the substitution will succeed and ed will not produce an error when foo is not found:

Code: Alles auswählen

#Second version will add the line with "something" even if foo is not found
ed -s file <<< $'H\n1g/foo/s/foo/bar/\na\nsomething\n.\nw'
Aber auch dieser Vorschlag mit dem führenden g/ funktioniert nicht - vermutlich weil ich nicht nach foo suche um foo dann durch bar zu ersetzen, sondern in dem Bereich "foo1 bis foo2" "bar1" durch "bar2" ersetzen will.

Dank Euch!

Edit: habe noch versucht die Ziel-Zeilen: /<ul class="menu">/,/<\/ul><!--menu-->/
in einen Ziel-Bereich abzuändern g/<ul class="menu">.*<\/ul><!--menu-->/
--> das Ziel wurde nicht mehr gefunden, aber das Script auch nicht abgebrochen...

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

Re: ed im Script

Beitrag von Meillo » 11.01.2019 12:51:42

In meinem Heirloom ed sieht das so aus:

Code: Alles auswählen

:-Q ed  /tmp/a
257
/aaa/,/bbb/s/xxx/yyy/g
?
a
foo
.
w
261
q

:-Q echo $?           
0

:-Q tail -1 /tmp/a 
foo

:-Q 
Also alles genau so wie man es erwartet ... aber die Geschichte geht noch weiter ...

k2 hat geschrieben: ↑ zum Beitrag ↑
10.01.2019 23:19:19
Ist nicht ganz so tragisch, denn wenn ed nichts ersetzen muss - dann kann er sich auch beenden.
Ich wuerde sagen, dass ich das anders sehe, denn wenn ich ed interaktiv nutze, wofuer ed ursprunglich ja auch da war -- er war *der* Editor in Unix, der mit dem ganz Unix geschrieben worden ist -- dann soll der sich keinesfalls beenden, wenn er wegen irgendeinem Tippfehler von mir etwas nicht finden oder nicht ersetzen kann. Ein Editor darf sich nur beenden, wenn ich es ihm sage, denn sonst wuerde ich ja moeglicherweise wertvolle Arbeitsergebnisse verlieren.
Der Funktion des Scripts tut das nichts. Allerdings nicht schön und ziemlich dirty, außerdem leite ich die Ausgabe evt. noch in ein Log-File um und dann steht da bei jedem bearbeiteten Unterverzeichnis ggf. ein "?".

Vielleicht macht es ja noch KLICK. In http://wiki.bash-hackers.org/howto/edit-ed ist der Fall so beschrieben:
Pitfalls
...
an error stops the script
...
If you want the same behaviour you can use g/foo/ to trick ed. g/foo/ will apply the command on all lines matching foo, thus the substitution will succeed and ed will not produce an error when foo is not found:

Code: Alles auswählen

#Second version will add the line with "something" even if foo is not found
ed -s file <<< $'H\n1g/foo/s/foo/bar/\na\nsomething\n.\nw'
Aber auch dieser Vorschlag mit dem führenden g/ funktioniert nicht - vermutlich weil ich nicht nach foo suche um foo dann durch bar zu ersetzen, sondern in dem Bereich "foo1 bis foo2" "bar1" durch "bar2" ersetzen will.

Dank Euch!

Edit: habe noch versucht die Ziel-Zeilen: /<ul class="menu">/,/<\/ul><!--menu-->/
in einen Ziel-Bereich abzuändern g/<ul class="menu">.*<\/ul><!--menu-->/
--> das Ziel wurde nicht mehr gefunden, aber das Script auch nicht abgebrochen...
Einen Zeilenbereich kann man in ed nicht in eine einzelne Regexp umwandeln, da Regexps immer zeilenweise angewendet werden. (In Perl z.B. kann der `.' auch ein Newline matchen, in ed nicht.)

Die Bereichsangabe (/.../,/.../) ist ja schon was du haben willst: Nur in diesem Bereich sollen ueberhaupt Ersetzungen passieren.


Der Knackpunkt ist der: Wenn eine Ersetzung gemacht wird, dann wird die Zeile in der ersetzt worden ist zur aktuellen Zeile. Das anschliessende `a'-Kommando fuegt dann nach der ersetzten Zeile ein. Wenn nur aber keine Ersetzung getaetigt worden ist, dann wir die aktuelle Zeile auch nicht geaendert und folglich fuegt er hinter der Zeile ein, die davor die aktuelle Zeile war. Im konkreten Fall ist es die letzte Zeile, weil das beim Starten von ed die aktuelle Zeile ist.


Im interaktiven Fall ist das alles kein Problem, da der User ja auf die erfolgreiche oder nicht erfolgte Ersetzung reagieren kann und er weiss, wo dann eigefuegt wird. (Das ist das Szenario, das ich getestet habe.) Im gescripteten Fall kann auf das Problem nicht reagiert werden. (Das ist dein Fall.) Wenn die Ersetzung nicht stattfindet, dann wird vermutlich an der falschen Stelle eingefuegt. Um das zu verhindern, bricht ed nur dann ab, wenn er gescriptet genutzt wird, war dann mein Gedanke.

Also habe ich es ausprobiert (Heirloom ed gescriptet):

Code: Alles auswählen

:-Q ed - /tmp/a <<!
> /aaa/,/bbb/s/xxx/yyy/g
> a
> bar
> .
> w
> q
> !
?

:-Q echo $?
2

:-Q tail -1 /tmp/a
Letzte Zeile des Ursprungsdatei

:-Q 
... und siehe da: ed beendet sich mit einem Fehlercode und der Append fehlt.

Damit ist klar, was passiert! (Fuer euch auch?)


Das Problem ist, dass bei einer fehlgeschlagenen Ersetzung nicht sichergestellt ist, ob die weiteren Befehle noch das Korrekte tun. Darum bricht ed da ab.

Die Frage waere also an dich, was genau du nun tatsaechlich haben willst. In welchen Faellen soll der Append wo in der Datei passieren?
Use ed once in a while!

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: ed im Script

Beitrag von tobo » 11.01.2019 14:06:48

Meillo hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 12:51:42
Der Knackpunkt ist der: Wenn eine Ersetzung gemacht wird, dann wird die Zeile in der ersetzt worden ist zur aktuellen Zeile. Das anschliessende `a'-Kommando fuegt dann nach der ersetzten Zeile ein.
Bei heirloom; bei GNU ist die 2. Adresse danach die aktuelle Zeile.

Wenn aber sowieso nach der 2. Adresse eingefügt werden soll, dann sollte man einfach das append mit eben dieser 2. RegEx adressieren. Dann steigt GNU-ed an dieser Stelle auch nicht mehr aus.

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

Re: ed im Script

Beitrag von Meillo » 11.01.2019 18:56:06

tobo hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 14:06:48
Meillo hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 12:51:42
Der Knackpunkt ist der: Wenn eine Ersetzung gemacht wird, dann wird die Zeile in der ersetzt worden ist zur aktuellen Zeile. Das anschliessende `a'-Kommando fuegt dann nach der ersetzten Zeile ein.
Bei heirloom; bei GNU ist die 2. Adresse danach die aktuelle Zeile.
Diese Aussage kann ich nicht bestaetigen. Wenn ich in einem Bereich erfolgreich ersetze, dann ist am Ende die letzte ersetzte Zeile die aktuelle Zeile, siehe:

Code: Alles auswählen

:-Q ed /tmp/a <<!         
> /vier/,/neun/s/ch/ZZZ/
> .=
> ,n
> Q
> !
54
8
1       eins
2       zwei
3       drei
4       vier
5       fuenf
6       seZZZs
7       sieben
8       aZZZt
9       neun
10      zehn

:-Q 
Die 54 sind die Bytes die eingelesen wurden. Die 8 ist die aktuelle Zeile nach dem ersetzen (mit `.=' ausgegeben). Der Rest ist der volle Inhalt der Datei mit Zeilennummern (mit `,n' ausgegeben).

Man sieht also, dass nach der Ersetzung die Zeile 8 die aktuelle Zeile ist. Das ist diejenige mit der letzten Ersetzung. (Wohingegen der Bereich bis Zeile 9 ging.)


Bei fehlgeschlagener Ersetzung bricht ed ab:

Code: Alles auswählen

:-Q ed /tmp/a <<!         
> /vier/,/neun/s/xxx/ZZZ/
> .=
> ,n
> Q
> !
54
?

:-Q 

Wenn aber sowieso nach der 2. Adresse eingefügt werden soll, dann sollte man einfach das append mit eben dieser 2. RegEx adressieren. Dann steigt GNU-ed an dieser Stelle auch nicht mehr aus.
Ja.


Was wirklich gewuenscht ist, muss von der Fachseite entschieden werden.
Use ed once in a while!

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: ed im Script

Beitrag von tobo » 11.01.2019 20:17:02

Meillo hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 18:56:06
Man sieht also, dass nach der Ersetzung die Zeile 8 die aktuelle Zeile ist. Das ist diejenige mit der letzten Ersetzung. (Wohingegen der Bereich bis Zeile 9 ging.)
Das ist bei mir in der heirloom- und suckless-Variante auch so. Bei GNU ed 1.10 steht er danach aber auf 9! Die installierte Info-Seite sagt dazu:
Info zu GNU ed 1.10 hat geschrieben: The current address is set to the last line affected.
Das ist eindeutig zweideutig interpretierbar!? Aber offensichtlich bereits geregelt in GNU ed 1.15:
Man zu GNU ed 1.15 hat geschrieben: The current address is set to the address of the last line on which a substitution occurred.

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

Re: ed im Script

Beitrag von Meillo » 11.01.2019 21:03:26

Danke fuer die Infos, tobo.

Hier noch die Beschreibung zum s-Kommandos von ed aus POSIX:
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ed.html hat geschrieben: The current line number shall be set to the address of the last line on which a substitution is performed.
Das ist eindeutig.

(Der nicht ganz so klare Satz findet sich, in ganz aehnlicher Form, wie du ihn zitierst, im allgemeinen Abschnitt zu Adressen in ed: ``Generally, the current line is the last line affected by a command.'')


Hier noch die relevanten Abschnitte zum Fehlerfall: Beim s-Kommando:
It is an error if the substitution fails on every addressed line.
... was zur Folge hat:
CONSEQUENCES OF ERRORS

When an error in the input script is encountered, or when an error is detected that is a consequence of the data (not) present in the file or due to an external condition such as a read or write error:

* If the standard input is a terminal device file, all input shall be flushed, and a new command read.

* If the standard input is a regular file, ed shall terminate with a non-zero exit status.


Ach, diese POSIX-Seite zu ed ist herrlich! Ich werde mir die ausdrucken und nochmal genussvoll in aller Ruhe zu Gemuete fuehren muessen. :-D

... ausserdem muss ich ganz dringend wieder mehr mit ed arbeiten. Der ist ja so ein cooler Editor! Ed man! !man ed :THX:
Use ed once in a while!

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Re: ed im Script

Beitrag von k2 » 11.01.2019 22:30:14

Hallo zusammen,
Meillo hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 12:51:42
Die Frage waere also an dich, was genau du nun tatsaechlich haben willst. In welchen Faellen soll der Append wo in der Datei passieren?
tobo hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 14:06:48
Wenn aber sowieso nach der 2. Adresse eingefügt werden soll, dann sollte man einfach das append mit eben dieser 2. RegEx adressieren. Dann steigt GNU-ed an dieser Stelle auch nicht mehr aus.
Ich habe das append nur testweise angehängt, um den Abbruch durch ed zu verifizieren und einen Fehlercode zu erhalten. Mein Bash-Script könnte funktionell damit leben, dass sich ed verabschiedet, da er danach sowieso beendet wird und wenn nichts zu ersetzen ist auch nicht zurückgeschrieben werden muss:

Code: Alles auswählen

ed -v -s ${datei} <<EOF
/<ul class="menu">/,/<\/ul><!--menu-->/s/<a href=".\//<a href=".\/..\//g
wq
EOF
Es ist eben nur extrem unschön, wenn man so einen Fehler tolerieren soll. Evt. werde ich eben doch sed dafür einsetzen oder das Vorhandensein des Ersetzungsbereiches im Bashscript vor Aufruf von ed abfragen und ed nur im Ersetzungsfall starten.

Danke Euch, es ist nicht ganz einfach eine etwas umfangreichere Textbearbeitung mit der Bash zu verwirklichen.
Vielleicht wäre es jetzt ja an der Zeit, dass ich eine "richtige" Programmieersprache lerne...
:?

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: ed im Script

Beitrag von tobo » 11.01.2019 23:00:09

k2 hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 22:30:14
Es ist eben nur extrem unschön, wenn man so einen Fehler tolerieren soll.
Ich würde das nicht zwingend als Fehler bezeichnen!? Jedenfalls würde ich kein weiteres Programm zusätzlich dafür nutzen, um erstmal zu schauen, ob der Bereich überhaupt vorhanden ist. Denn es kommt auch der Fehler, wenn der Bereich zwar vorhanden ist, die Substitution aber nicht gelingt. Und wenn man das jetzt auch noch vorher abprüfen würde, dann wäre das langsam uncool!?
Du hast noch sinnige Möglichkeiten:
1. Du unterdrückst die Fehlerausgabe:

Code: Alles auswählen

ed -s "${datei}" 2>/dev/null <<EOF
2. Du nimmst den großen Bruder ex:

Code: Alles auswählen

ex - "${datei}" <<EOF

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

Re: ed im Script

Beitrag von Meillo » 12.01.2019 09:41:23

tobo hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 23:00:09
1. Du unterdrückst die Fehlerausgabe:

Code: Alles auswählen

ed -s "${datei}" 2>/dev/null <<EOF
Das waere meine Empfehlung, denn wenn dein ed-Programm sowieso nur genau diese eine Ersetzung macht und der Fall, dass man nicht ersetzen kann, valide ist, dann kannst du den Fehler ignorieren.

Falls du sowas wie `set -e' verwendest, brauchst du dann noch ein ``|| true'' damit dein Shellscript nicht abbricht:

Code: Alles auswählen

ed -s "${datei}" 2>/dev/null <<EOF || true
Use ed once in a while!

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

Re: ed im Script

Beitrag von Meillo » 12.01.2019 09:43:04

k2 hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 22:30:14
Vielleicht wäre es jetzt ja an der Zeit, dass ich eine "richtige" Programmieersprache lerne...
:?
Meinst du awk? :-D *scnr*
Use ed once in a while!

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Re: ed im Script

Beitrag von k2 » 12.01.2019 11:19:38

Nein, ich dachte eher an Emacs-Lisp :)

Da ich kein Profi bin, nehme ich für solche Scripte das was ich ohnehin schon bediene und das ist eben die BASH. Leider stößt man damit schon mal an die Grenzen. Insbesondere wenn Textbearbeitung über mehrere Zeilen erfolgen soll. ed, sed usw. sind ja primär für zeilenweise Bearbeitung ausgelegt. Ich weiß jetzt nicht, ob ex da so anders ist. Könnte ich mir mal anschauen - damit käme ich evt. auch vi näher; momentan ist joe mein Konsoleneditor.

Mit richtiger Programmiersprache meine ich so etwas wie C (back to the roots) und weiter mit C++ oder Python (mit wenig Aufwand viel erreichen - aber die Konfiguration...) Mein Script erreicht derzeit die 100k-Grenze (mit viel Content-Ballast wie HTML, CSS und SVG) und wird so laaangsam unhandlich im Editor; dafür ist ein One-File-Script unproblematisch in der Anwendung ohne Installation.

Zum Problemchen:
Euch erst mal vielen Dank für die tolle Hilfe!
Meillo hat geschrieben: ↑ zum Beitrag ↑
12.01.2019 09:41:23
Ich würde das nicht zwingend als Fehler bezeichnen!?
Ich meinte damit nicht ed, sondern mein Script.
Auf Eure Empfehlung hin, werde ich vor dem Aufruf von ed nicht noch eine Abfrage starten ob es etwas zu ersetzen gibt. (evt kann ich im Fluß des Scriptes da noch etwas umbiegen). Eds durchaus sinnvolle Meldung möchte ich auch nicht gleich in die /dev/null/-Tonne kicken, ich denke ich werde sie abfragen und um einen Kommentar ergänzen, damit es nachvollziehbar nicht als Fehler gewertet wird.

Danke! :THX:
Schön, dass man hier so kompetente Ansprechpartner findet; Mir fallen gerade noch ein paar Schwierigkeiten mit bzw. Verrenkungen durch ed ein ... aber jetzt muss ich erst mal Schnee schippen gehen ... ich sitze am Alpenrand ...

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

Re: ed im Script

Beitrag von Meillo » 12.01.2019 12:09:54

k2 hat geschrieben: ↑ zum Beitrag ↑
12.01.2019 11:19:38
Ich weiß jetzt nicht, ob ex da so anders ist. Könnte ich mir mal anschauen - damit käme ich evt. auch vi näher; momentan ist joe mein Konsoleneditor.
ex ist eine Art ed++, also ein verbesserter ed. Aus vi heraus kannst du alle ex-Befehle nutzen ... aber ob dich Kenntnisse von ex dem vi naeher bringen, weiss ich nicht. Lohnen tut sich der vi aber allemal. ;-)

Vielleicht erleichtert dir das den Einstieg: http://marmaro.de/docs/vi-for-nano-users/ Ich habe es verfasst, nachdem Tony Müller mich ueberzeugt hat, dass man Anfaengern nicht zwangslaeufig nano beibringen muss, sondern dass selbst Anfaenger mit vi arbeiten koennen. Das Schoene am vi ist, dass wenn du zumindest auf nano-Niveau mit ihm arbeiten kannst (was mein Paper ermoeglichen soll), dann kannst du fliessend beliebig weit deine Editiermoeglichkeiten verbessern. Beim vi (ebenso bei Emacs) gibt es so gut wie keine Grenzen nach oben.

Mit richtiger Programmiersprache meine ich so etwas wie C (back to the roots) und weiter mit C++ oder Python (mit wenig Aufwand viel erreichen - aber die Konfiguration...) Mein Script erreicht derzeit die 100k-Grenze (mit viel Content-Ballast wie HTML, CSS und SVG) und wird so laaangsam unhandlich im Editor; dafür ist ein One-File-Script unproblematisch in der Anwendung ohne Installation.
Textverarbeitung (was dein aktuelles Script ja macht) ist sehr umstaendlich in C. Wenn du in der Richtung mehr brauchst als sh, und awk auch nicht reicht, dann sind moderne Scriptsprachen (Perl, Python, Ruby, PHP, ...) die beste Option. Gerade auch wenn's in Richtung XML-Content geht, will man das moeglichst nicht auf Textbasis bearbeiten, sondern ueber XML-Datenstrukturen, weil man dann stets valides XML hat und sich nicht um De-/Encoding von Values (&lt;) kuemmern muss.

Schön, dass man hier so kompetente Ansprechpartner findet; Mir fallen gerade noch ein paar Schwierigkeiten mit bzw. Verrenkungen durch ed ein ... aber jetzt muss ich erst mal Schnee schippen gehen ... ich sitze am Alpenrand ...
Vom Schneeschippen komme ich gerade her. ;-) Themen dieser Art finde ich immer klasse. Du darfst uns gerne hin und wieder damit beschenken! :THX:
Use ed once in a while!

k2
Beiträge: 132
Registriert: 14.08.2002 22:29:28
Lizenz eigener Beiträge: MIT Lizenz

Ein Workaround schafft Linderung

Beitrag von k2 » 18.01.2019 11:54:34

Ein Workaround schafft Linderung

Da das mit ed zu bearbeitende Dokument vom BASH-Script selbst erstellt wird, konnten die im Bereich von <ul class="menu"> bis </ul><!--menu--> stehenden <li>-Zeilen für ed mit <!--menu-item--> gekennzeichnet werden. ed muss nun nicht mehr in einem Bereich suchen, in dem er eventuell nichts zum Ändern findet, sondern sucht alle markierten Zeilen und kann dann auch etwas ändern.

Aus
ed -v -s ${datei} <<EOF
/<ul class="menu">/,/<\/ul><!--menu-->/s/<a href=".\//<a href=".\/..\//g
wq
EOF
wird
ed -v -s ${datei} <<EOF
g/<!--menu-item--><li>/s/<a href=".\//<a href=".\/..\//g
wq
EOF
... und alles ist gut.

Antworten