ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo zusammen! Ich stehe gerade etwas auf dem Schlauch. Ich versuche mittels sed eine Leerzeile und das darauf folgende pattern zu ersetzen. Dazu habe ich folgende Syntax verwendet: sed -E 'N;s#regex#newContent#'
Das N sorgt ja dafür, dass die vorherige Zeile aus dem HOLD an die aktuelle Zeile angefügt wird und aus zwei Zeilen, einen durch \n getrennten Einzeiler macht, vgl. sed - Multiline-techniques 🇬🇧. Als konkreten Fall habe ich die Datei /usr/share/X11/xkb/rules/evdev.lst kopiert, einmal als kleine Testdatei zusammengestaucht und einmal Original belassen. Die kleine Beispieldatei evdev.small:
! model
pc101 Generic 101-key PC
teck229 Truly Ergonomic Computer Keyboard Model 229 (Standard sized Alt keys, additional Super and Menu key)
! layout
us English (US)
id Indonesian (Arab Melayu, phonetic)
jv Indonesian (Javanese)
my Malay (Jawi, Arabic Keyboard)
! variant
chr us: Cherokee
euro us: English (US, euro on 5)
phonetic my: Malay (Jawi, phonetic)
! option
grp Switching to another layout
terminate Key sequence to kill the X server
terminate:ctrl_alt_bksp Ctrl+Alt+Backspace wird durch sed -E 'N;s#^$\n\! option# my customVariant\n\n! option\n my customOption#' evdev.small zu ! model
pc101 Generic 101-key PC
teck229 Truly Ergonomic Computer Keyboard Model 229 (Standard sized Alt keys, additional Super and Menu key)
! layout
us English (US)
id Indonesian (Arab Melayu, phonetic)
jv Indonesian (Javanese)
my Malay (Jawi, Arabic Keyboard)
! variant
chr us: Cherokee
euro us: English (US, euro on 5)
phonetic my: Malay (Jawi, phonetic)
my customVariant
! option
my customOption
grp Switching to another layout
terminate Key sequence to kill the X server
terminate:ctrl_alt_bksp Ctrl+Alt+Backspace vim zeigt mir auch in beiden Dateien die gleichen Steuerzeichen an, was logisch ist, da ich ja nur Zeilen unterhalb der Optionen ausgeschnitten habe:
14 phonetic my: Malay (Jawi, phonetic)$
15 $
16 ! option$
17 grp Switching to another layout$ Auf die gesamte Datei evdev.lst angewandt funktioniert das aber nicht. Es gibt auch nur ein einziges Vorkommen von "! option", ein aufs Geratewohl escapen des Ausrufezeichens änderte auch nichts. Wo ist mein Denkfehler?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Ein möglicher Grund ist, dass Du das N ja immer ausführst. Da müsste eigentlich dafür sorgen, dass am Ende die gesamte Datei im Hold-Space ist. Und dann gibt es nur eine Ersetzung, weil du /g nicht angegeben hast. Merkwürdig finde ich übrigens das Dollarzeichen mitten im Pattern. Da darauf ja sowieso ein \n folgt, müsste der $ da überflüssig sein. Aber das weiß User Unknown bestimmt besser, weil der sich mit sed besser auskennt. Ich würde das ja mit awk oder ruby machen.
|
ChickenLipsRfun2eat
(Themenstarter)
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
rklm schrieb: Ein möglicher Grund ist, dass Du das N ja immer ausführst. Da müsste eigentlich dafür sorgen, dass am Ende die gesamte Datei im Hold-Space ist. Und dann gibt es nur eine Ersetzung, weil du /g nicht angegeben hast.
Aber selbst bei nur einer Ersetzung in der gesamten Datei… es gibt ja nur den einen Treffer. Aber mit der Datenmenge wird es schon zu tun haben, da sich die Dateien ja nur darin unterscheiden. Global bringt übrigens keinen Unterschied. Merkwürdig finde ich übrigens das Dollarzeichen mitten im Pattern. Da darauf ja sowieso ein \n folgt, müsste der $ da überflüssig sein. Aber das weiß User Unknown bestimmt besser, weil der sich mit sed besser auskennt.
Laut Manual ist „^$“ eine Leerzeile. Aber ich warte dann auch mal auf den Unbekannten.
Ich würde das ja mit awk oder ruby machen.
…aber ich hab halt jetzt mal sed genommen. awk steht bei mir auch noch auf der „Wunschliste“, das kann auch ziemlich viel. ruby und perl reizen mich irgendwie gar nicht. K.A. wieso. Demnächst mache ich eh alles nur noch mit emacsclient -e '(viele(Klammern(später(kommt(die(Ausgabe))))))' 😀 Habe aber auch nicht mehr weiter mit „gespielt“. Mein nächster Versuch wäre wohl etwas mit sed 'H;$!d' , um nicht die ganze Datei im Puffer zu haben. Morgen bin ich schlauer ☺
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
| #!/usr/bin/awk -f
/^$/ { if (leer) print; else leer=1 }
!/^$/ { if (leer && match($0, /! option/)) printf "before\n\n%s\nafter\n", $0; else print; leer=0 }
|
Ausgeführt 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | $ ./s data
! model
pc101 Generic 101-key PC
teck229 Truly Ergonomic Computer Keyboard Model 229 (Standard sized Alt keys, additional Super and Menu key)
! layout
us English (US)
id Indonesian (Arab Melayu, phonetic)
jv Indonesian (Javanese)
my Malay (Jawi, Arabic Keyboard)
! variant
chr us: Cherokee
euro us: English (US, euro on 5)
phonetic my: Malay (Jawi, phonetic)
before
! option
after
grp Switching to another layout
terminate Key sequence to kill the X server
terminate:ctrl_alt_bksp Ctrl+Alt+Backspace
|
|
ChickenLipsRfun2eat
(Themenstarter)
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Mal ohne Handbuch: zunächst prüfst du auf die Anzahl Zeichen der aktuellen Zeile, wenn da keine sind: leer=1. Zeile 2 invertiert die Suche, prüft die Variable aus Zeile 1 auf Gültigkeit, ermittelt dann den Substring und — wenn alles passt — fügt davor und dahinter etwas ein. Falls ich das richtig verstanden habe, wäre es nicht besser erst auf leer zu prüfen? Wir wissen ja, dass vorher eine Leerzeile sein muss. Also sowas wie | #!/usr/bin/env pseudo-awk
/^$/ { if (leer) print; else leer=1 }
if( leer )
!/^$/ { if (match($0, /! option/)) printf "before\n\n%s\nafter\n", $0; else print }
else
skipLine?
leer=0;
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Von der Logik her wäre der Vorschlag von rklm in etwa sowas als Shell-Skript:
1
2
3
4
5
6
7
8
9
10
11
12 | #!/usr/bin/bash
declare -i leer=0
while read -r line
do
if [ "${#line}" -eq 0 ] # leere Zeile?
then
[ "$leer" -eq 1 ] && echo "$line" || leer=1
else
[[ "$line" =~ !\ option ]] && echo -ne "before\n\n${line}\nafter\n" || echo -ne "\n$line\n"
leer=0
fi
done < "$1"
|
Bei deinem Ansatz würde das nach meinem Verständnis so aussehen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | #!/usr/bin/bash
declare -i leer=0
while read -r line
do
if [ "${#line}" -eq 0 ] # leere Zeile?
then
[ "$leer" -eq 1 ] && echo "$line" || leer=1
fi
if [ "$leer" -eq 1 ]
then
if [ "${#line}" -gt 0 ]
then
[[ "$line" =~ !\ option ]] && echo -ne "before\n\n${line}\nafter\n" || echo -ne "$line"
fi
else
continue
fi
leer=0
done < "$1"
|
Abgesehen davon, dass man mehrfach den selben Test durchführt, überspringt er so alle Zeilen ohne Ausgabe. Solange die Datei in den RAM passt, würde ich mir das Leben einfacher machen und sie in einem Rutsch statt zeilenweise einlesen - wenn man GNU sed auf null-terminierte Zeilen umschaltet (Schalter -z ), geht das recht bequem und hat den Vorteil, dass die Leerzeilen zwischen den Blöcken alle erhalten bleiben:
sed -z 's/\n\n! option\n/\nbefore\n\n! option\n\nafter\n/g' test.txt
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
ChickenLipsRfun2eat schrieb: Mal ohne Handbuch: zunächst prüfst du auf die Anzahl Zeichen der aktuellen Zeile, wenn da keine sind: leer=1.
Zusätzlich wird aber eine Leerzeile ausgegeben, falls die letzte Zeile eine Leerzeile war - man will ja die Eingabe an allen Stellen erhalten, die nicht ersetzt werden sollen.
Zeile 2 invertiert die Suche, prüft die Variable aus Zeile 1 auf Gültigkeit, ermittelt dann den Substring und — wenn alles passt — fügt davor und dahinter etwas ein.
"Gültigkeit" finde ich etwas irreführend. leer ist lediglich ein boolsches Flag, das anzeigt, ob die letzte zuvor gelesene Zeile eine Leerzeile war. Der Substring wird zwar ermittelt, aber es wird nur verwendet, ob es einen Treffer gibt oder nicht.
Falls ich das richtig verstanden habe, wäre es nicht besser erst auf leer zu prüfen? Wir wissen ja, dass vorher eine Leerzeile sein muss. Also sowas wie | #!/usr/bin/env pseudo-awk
/^$/ { if (leer) print; else leer=1 }
if( leer )
!/^$/ { if (match($0, /! option/)) printf "before\n\n%s\nafter\n", $0; else print }
else
skipLine?
leer=0;
|
Das Problem ist, dass das Muster vor der geschweiften Klammer keine Alternativverarbeitung (else ) erlaubt. Man müsste dann also mehr Muster und Aktionen verwenden, was hier eklig wird, weil ja drei Bedingungen im Spiel sind. Mir fehlt gerade die Zeit das auszuformulieren, aber es ist sicher komplizierter als meine Variante.
|
ChickenLipsRfun2eat
(Themenstarter)
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
seahawk1986 schrieb: Von der Logik her wäre der Vorschlag von rklm in etwa sowas als Shell-Skript:
Danke für die Übersetzung! Das kann ich besser lesen als awk 😉 [ "$leer" -eq 1 ] && echo "$line" || leer=1 würde bei mir auch deutlich komplizierter aussehen. Das klau ich mir als Alternative für den ternären Operator 😉 Danke!
Bei deinem Ansatz würde das nach meinem Verständnis so aussehen:
Beim sed 'N' -Ansatz oder meiner Vermutung bezüglich des awk-Scripts? Vergiss das mit awk, das hab ich nur nicht verstanden…
Solange die Datei in den RAM passt, würde ich mir das Leben einfacher machen …
Danke! Das ist eine gute Alternativlösung! Das -z hatte ich auch gar nicht auf dem Schirm. Manchmal möchte ich halt verstehen, warum etwas nicht funktioniert. Bei sed ist es das 'N'… Das kannst du nicht auch zufällig erklären? rklm schrieb: Zusätzlich wird aber eine Leerzeile ausgegeben, falls die letzte Zeile eine Leerzeile war - man will ja die Eingabe an allen Stellen erhalten, die nicht ersetzt werden sollen.
Das habe ich jetzt mit der Übersetzung auch gesehen, vorher nicht. "Gültigkeit" finde ich etwas irreführend.
Ja, das liegt wohl daran, dass ich kein Programmierer bin. Für mich ist 1 gültig und 0 ungültig, also der blanke Wert. leer an sich ist immer gültig, egal welchen Wert es enthält, daher versteh ich die Irreführung. Ich gelobe Besserung, verspreche aber nichts 😉
Das Problem ist, dass das Muster vor der geschweiften Klammer keine Alternativverarbeitung (else ) erlaubt. Man müsste dann also mehr Muster und Aktionen verwenden, was hier eklig wird, weil ja drei Bedingungen im Spiel sind. Mir fehlt gerade die Zeit das auszuformulieren, aber es ist sicher komplizierter als meine Variante.
Mir ist das so kompliziert genug, danke. Du musst das nicht ausarbeiten 😉 Wenn ich mich mal mit awk beschäftige, komme ich sehr gerne auf dich zurück!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
ChickenLipsRfun2eat schrieb: Manchmal möchte ich halt verstehen, warum etwas nicht funktioniert. Bei sed ist es das 'N'… Das kannst du nicht auch zufällig erklären?
Ich habe gerade kein Debian mit sed 4.7 zur Hand - ich habe mir die Datei /usr/share/X11/xkb/rules/evdev.lst aus http://ftp.de.debian.org/debian/pool/main/x/xkeyboard-config/xkb-data_2.29-2_all.deb geholt und mit sed 4.7 (Ubuntu 20.04) und 4.8 (Arch Linux) kann ich das Problem nicht nachvollziehen.
|
ChickenLipsRfun2eat
(Themenstarter)
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Ich habe auch kein Debian, nur ein 20.04 mit dem ich das gerade mache. Ich habe mir die Datei jetzt ebenfalls von da geladen und da funktioniert auch bei mir die Ersetzung. Aber die Idee war goldrichtig! Der Unterschied ist der, dass ich in der lokalen eine ungerade Anzahl Zeilen vor „! options“ habe und in der „frischen“ eine gerade Anzahl Zeilen. Anscheinend ist genau da der Haken bei der 'N'-Abfrage. Lässt sich auch im Minimalbeispiel gut nachvollziehen: Wenn ich die auf …
jv Indonesian (Javanese)
my Malay (Jawi, Arabic Keyboard)
my Malay (Jawi, Arabic Keyboard)
…
! option
…
abändere, funktioniert die 'N'-Abfrage auch nicht… Da muss man auch erst mal drauf kommen… Jetzt, wo ich es weiß ist es auch logisch. Bei ungeraden Linien müsste ich ja auf „option\n grp“ testen. Insofern wäre die 'N'-Lösung in der Form sowieso zu fehleranfällig und ich müsste ebenfalls eine Prüfung auf vorangegangene Leerzeilen machen, womit wir dann wieder bei awk oder -z wären. Damit weiß ich, wieso es nicht funktioniert und danke euch beiden sehr für die Hilfestellung!!! Freudige Grüße!
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Die hohen Erwartungen an meine Sedkenntnisse muss ich leider etwas dämpfen. Dieses Puffern mit dem Holdspace habe ich nicht wirklich durchdrungen und mehr Beispiele abgetippt, als selbst schon sinnvoll eingesetzt. Ohne Manpage fange ich damit gar nicht erst an. Geschweifte Klammern sind auch so ein Dunkelfeld - da habe ich neulich eine funktionierende Lösung für was gebastelt aber war überrascht, dass es geklappt hat, und würde kein TÜV-Siegel drauf kleben. Hier ist mir schon unklar was eigentlich das Ziel ist: Ein Problem in der realen Welt lösen oder nur verstehen, was N macht? Das Beispiel lese ich so, dass die letzte Zeile vor einer Leerzeile des letzten Abschnitts ergänzt werden soll, wenn der nächste Abschnitt ! option ist. Hier ist der letzte Abschnitt ! variant. In der Praxis würde ich bei so einer Konfigurationsdatei erwarten, dass die Abschnitte umsortiert sein können oder neue dazwischen dazu kommen, so dass die letzte, eingefügte Zeile dann im falschen Abschnitt steht. Dann arbeitet sed von Hause aus auf ganzen Zeilen und nur mit Tricks über mehrere Zeilen, wobei mir Seahawks Lösung mit -z sehr zusagt. Das semantische Problem hätte ich so gelöst: | sed '/! variant/,/^$/s/^$/ uuv\t\t uu:uuvariant\n/; s/! option/! option\n uuo\tuu uuoption/' ev.dev
|
Das sind 2 Sedbefehle, durch ; getrennt.
Erst von ! variant bis zur Leerzeile suchen. Dort die Leerzeile substituieren mit meinem uuv-Zeug, bei dem das abschließende Zeilenende für eine neue Leerzeile sorgt.
Für den Abschnitt ! option wird ein neuer Befehl benutzt. Dann gibt es noch die Lösung des flotten Pfuschs: | sed 's#! option# before\n\n! option\n after#' ev.dev
|
der von der richtigen Reihenfolge der Abschnitte abhängt und sich darauf verlässt, dass eine Leerzeile niemandem wehtut: 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | ! variant
deadacute de: German (dead acute)
deadgraveacute de: German (dead grave acute)
nodeadkeys de: German (no dead keys)
qwerty de: German (QWERTY)
gag md: Moldavian (Gagauz)
before
! option
after
grp Switching to another layout
grp:switch Right Alt (while pressed)
grp:lswitch Left Alt (while pressed)
|
Das -E, fand ich bei der Gelegenheit raus, war überhaupt überflüssig.
|
ChickenLipsRfun2eat
(Themenstarter)
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
user_unknown schrieb: Die hohen Erwartungen an meine Sedkenntnisse muss ich leider etwas dämpfen…
Schade 😉 Aber ich kann verstehen, dass du da nicht weiter in die Materie eingedrungen bist. Ist auch etwas abenteuerlich.
Hier ist mir schon unklar was eigentlich das Ziel ist: Ein Problem in der realen Welt lösen oder nur verstehen, was N macht?
Das Thema kam aus der realen Welt, da gab es dann aber eine bash-Lösung für, die ich auch verstehe. Bei der Suche bin ich über sed 'N' gestolpert, was auch funktionierte. Da ich das aber nicht verstanden habe, habe ich rumprobiert. Das mit den Keyboard-Dateien liegt daran, dass ich von denen einige Tests rumfliegen habe, weil ich kürzlich mein Layout ein wenig überarbeitet habe. Die zusätzliche Leerzeile würde wohl nicht stören, genausowenig wie das mit zwei sed-Befehlen zu machen. Daher fehlt hier vielleicht etwas Sinnhaftigkeit. Ich habe nur versucht anhand des seq -Beispiels der GNU-Seite etwas aus dem „echten Leben“ zu verarbeiten und diese Ersetzung vorzunehmen. Leider findet man bei der Suche nach sed nur 1001 Aufgüsse des selen Blogposts mit den Standards.
Das Beispiel lese ich so, dass die letzte Zeile vor einer Leerzeile des letzten Abschnitts ergänzt werden soll, wenn der nächste Abschnitt ! option ist. Hier ist der letzte Abschnitt ! variant.
Richtig. Aus \n! option\n sollte \nxyx\n! option\nxyz\n werden.
In der Praxis würde ich bei so einer Konfigurationsdatei erwarten, dass die Abschnitte umsortiert sein können oder neue dazwischen dazu kommen, so dass die letzte, eingefügte Zeile dann im falschen Abschnitt steht.
Ja, normalerweise würde man wohl die Einträge unter ihre eigentlichen Segmente setzen, auch wenn sich gerade in dem Beispiel die Dateien nicht (mehr) ändern.
Dann arbeitet sed von Hause aus auf ganzen Zeilen und nur mit Tricks über mehrere Zeilen, wobei mir Seahawks Lösung mit -z sehr zusagt.
Ja, die fand ich auch sehr gut.
| sed '/! variant/,/^$/s/^$/ uuv\t\t uu:uuvariant\n/; s/! option/! option\n uuo\tuu uuoption/' ev.dev
|
Das -E, fand ich bei der Gelegenheit raus, war überhaupt überflüssig.
Inwiefern? Die Zeile sed -E 'N;s#^$\n\! option# my customVariant\n\n! option\n my customOption#' /usr/share/X11/xkb/rules/evdev.lst funktioniert nur mit -E, da sonst die Leerzeile am Anfang nicht interpretiert wird. Oder was meinst du?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
ChickenLipsRfun2eat schrieb: user_unknown schrieb: Das -E, fand ich bei der Gelegenheit raus, war überhaupt überflüssig.
Inwiefern? Die Zeile sed -E 'N;s#^$\n\! option# my customVariant\n\n! option\n my customOption#' /usr/share/X11/xkb/rules/evdev.lst funktioniert nur mit -E, da sonst die Leerzeile am Anfang nicht interpretiert wird. Oder was meinst du?
Ich habe Gnu-sed Version 4.4
| sed --version
sed (GNU sed) 4.4
|
Vielleicht können wir uns auch zuerst darauf einigen, dass der Backslash in \! überflüssig ist. Dass "! option" in einer Zeile steht kann man mit ^ davor und $ danach ausdrücken:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | sed 's#^! option$# before ->\n\n! option\n <- after#' ev.dev | tail -n 15
! variant
deadacute de: German (dead acute)
deadgraveacute de: German (dead grave acute)
nodeadkeys de: German (no dead keys)
qwerty de: German (QWERTY)
gag md: Moldavian (Gagauz)
before ->
! option
<- after
grp Switching to another layout
grp:switch Right Alt (while pressed)
grp:lswitch Left Alt (while pressed)
|
Hier hat man natürlich das "before →" mit einer häßlichen Leerzeile abgesetzt. Dein Befehl klappt bei mir überhaupt nicht:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | sed -E 'N;s#^$\n! option# before ->\n\n! option\n <- after#' ev.dev | tail -n 15
at German (Austria)
de German
! variant
deadacute de: German (dead acute)
deadgraveacute de: German (dead grave acute)
nodeadkeys de: German (no dead keys)
qwerty de: German (QWERTY)
gag md: Moldavian (Gagauz)
! option
grp Switching to another layout
grp:switch Right Alt (while pressed)
grp:lswitch Left Alt (while pressed)
|
und ich vermute, dass es nicht klappt, weil sed bei der Mustererkennung zeilenweise arbeitet (im Ersetzungsausdruck kann man munter mit \n arbeiten, ohne jegliche Zeremonie vorweg), und nach ^$ (leere Zeile) in der Zeile dann nichts mehr kommen kann, insbesondere kein Zeilenumbruch. Aber mit -z und \n geht es: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | sed -z 's#\n! option# before ->\n\n! option\n <- after#' ev.dev | tail -n 15
! variant
deadacute de: German (dead acute)
deadgraveacute de: German (dead grave acute)
nodeadkeys de: German (no dead keys)
qwerty de: German (QWERTY)
gag md: Moldavian (Gagauz)
before ->
! option
<- after
grp Switching to another layout
grp:switch Right Alt (while pressed)
grp:lswitch Left Alt (while pressed)
|
|
ChickenLipsRfun2eat
(Themenstarter)
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
user_unknown schrieb: Vielleicht können wir uns auch zuerst darauf einigen, dass der Backslash in \! überflüssig ist.
Ja, der gehört da auch gar nicht hin. Der ist von einer „Verzweiflungstat“ übrig geblieben.
Dein Befehl klappt bei mir überhaupt nicht:
Wenn es nicht funktioniert: Ist die Zeilennummer von „! option“ bei dir eine gerade oder ungerade Zahl? Funktioniert wie erwähnt nur bei geraden Zahlen, sonst steht das „ grp “ mit in der Zeile. verdopple einfach eine Zeile weiter oben, dann geht es^^ In meinem kleinen Beispiel kann man das gut testen, wenn man
ausführt. Da sieht man, dass bei ungeraden Zeilen oberhalb der entsprechende Bereich so aussieht: … phonetic my: Malay (Jawi, phonetic)\n$
! option\n grp Switching to another layout$
terminate Key sequence to kill the X server\n terminate\…
anstatt wie beim funktionierenden so: …Malay (Jawi, phonetic)$
\n! option$
grp Switching to another layout\n terminate \…
Das war letztendlich auch der Grund, wieso die Abfrage nicht funktioniert hat.
Aber mit -z und \n geht es:
Ja, tadellos. Unabhängig der vorherigen Zeichen. Das sed -z macht aus der Datei ! model\n pc101 Generic 101-key PC\n teck229 Trul\y Ergonomic Computer Keyboard Model 229 (Standard sized Alt keys, add\itional Super and Menu key)\n\n! layout\n us English (U\S)\n id Indonesian (Arab Melayu, phonetic)\n jv \ Indonesian (Javanese)\n my Malay (Jawi, Arabic K\eyboard)\n\n! variant\n chr us: Cherokee\n euro \ us: English (US, euro on 5)\n phonetic my: Malay (Jawi, p\honetic)\n\n! option\n grp Switching to another lay\out\n terminate Key sequence to kill the X server\n term\inate:ctrl_alt_bksp Ctrl+Alt+Backspace\n\n$ und man ersetzt quasi im Einzeiler. Ich müsste das also ganz ohne N lösen. Das wäre dann Roberts awk -Script oder deine 'uuv'-Version.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
ChickenLipsRfun2eat schrieb: user_unknown schrieb: Vielleicht können wir uns auch zuerst darauf einigen, dass der Backslash in \! überflüssig ist.
Ja, der gehört da auch gar nicht hin. Der ist von einer „Verzweiflungstat“ übrig geblieben.
Dein Befehl klappt bei mir überhaupt nicht:
Wenn es nicht funktioniert: Ist die Zeilennummer von „! option“ bei dir eine gerade oder ungerade Zahl? Funktioniert wie erwähnt nur bei geraden Zahlen, sonst steht das „ grp “ mit in der Zeile. verdopple einfach eine Zeile weiter oben, dann geht es^^
Ah, das kann sein. Aber das ist ja kein Zustand, dass man ein Skript schreibt, dass nur funktioniert, wenn Einträge in den richtigen, geraden Zeilen stehen.
|