Text in Zeichenkette bestimmen, zB mit sed?
Ich habe eine sehr lange Text-Variable (Text aus mehreren Seiten). Darin kommt an unregelmäßiger Stelle, aber ziemlich gegen Ende eine bestimmte Zeichenkombination von "|center=4,3 |" (ohne "). 4,3 ist variabel, der Rest konstant. Grenzen sind also |. Die Stelle ist aber nicht konstant, daher ist cut nicht möglich. Wie bestimmte ich diesen Teil zB mit sed in einem bash-Skript? Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Al Bogner schrieb:
Ich habe eine sehr lange Text-Variable (Text aus mehreren Seiten). Darin kommt an unregelmäßiger Stelle, aber ziemlich gegen Ende eine bestimmte Zeichenkombination von "|center=4,3 |" (ohne "). 4,3 ist variabel, der Rest konstant. Grenzen sind also |. Die Stelle ist aber nicht konstant, daher ist cut nicht möglich.
Wie bestimmte ich diesen Teil zB mit sed in einem bash-Skript?
Al
Hi, sed ist ja eher zum Bearbeiten... ich würde was mit grep/egrep suchen... Ist es Fließtext (keine Linefeeds)? Dann ist es evt. sinnvoll, vorher mit tr oder sed Zeilenvorschübe aus was anderem zu machen, dann kann man mit grep auch umliegende Textstücke gut mitnehmen. Am besten, du postest mal einen Schnipsel und schreibst genau, was Du mit der Stelle oder ihrer Umgebung vorhast. cu jth -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Donnerstag 10 September 2009 15:42:17 schrieb Joerg Thuemmler:
Al Bogner schrieb:
Ich habe eine sehr lange Text-Variable (Text aus mehreren Seiten). Darin kommt an unregelmäßiger Stelle, aber ziemlich gegen Ende eine bestimmte Zeichenkombination von "|center=4,3 |" (ohne "). 4,3 ist variabel, der Rest konstant. Grenzen sind also |. Die Stelle ist aber nicht konstant, daher ist cut nicht möglich.
Wie bestimmte ich diesen Teil zB mit sed in einem bash-Skript?
Al
Hi,
sed ist ja eher zum Bearbeiten... ich würde was mit grep/egrep suchen... Ist es Fließtext (keine Linefeeds)?
Ursprünglich nicht sicher, ich mach aber schon ein grep "center=" Das sollte eindeutig sein, wenn ich nicht einen Sonderfall übersehen habe. Es bleibt also genau 1 Zeile über.
Dann ist es evt. sinnvoll, vorher mit tr oder sed Zeilenvorschübe aus was anderem zu machen, dann kann man mit grep auch umliegende Textstücke gut mitnehmen.
Am besten, du postest mal einen Schnipsel und schreibst genau, was Du mit der Stelle oder ihrer Umgebung vorhast.
Ergebnis soll im Beispiel 4,3 sein. Achtung es können auch Dezimalstellen (mit Dezimalpunkt vorkommen), also zB 4.2,3.756 Das darum herum muss egal sein. Es geht um die Suche wo "center=" ist. Eventuell könnte man das x. Vorkommen von | berechnen und dann mit cut -f - d"|" den Bereichen zwischen den | bestimmen und dann weiter mit cuf -f -d"=". Die Sache ist nicht zeitikritisch. Es gibt da sicher auch elegante Lösungen, aber das ist nicht so wichtig. Hauptsache es funktioniert. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Don, 10 Sep 2009, Al Bogner schrieb:
Das darum herum muss egal sein. Es geht um die Suche wo "center=" ist. Eventuell könnte man das x. Vorkommen von | berechnen und dann mit cut -f - d"|" den Bereichen zwischen den | bestimmen und dann weiter mit cuf -f -d"=".
Das 'center=' ist immer nach dem n-ten '|'? Dann bietet es sich an awk zu verwenden. awk -F'|' '/center=/{print $n;}' Den Inhalt von $n kannst du auch noch bearbeiten, z.B.: '{sub("center=","",$n); print $n;}' $ echo '|foo|bar|center = 4, 5.243 | baz |' | \ awk -F'|' '/center[[:space:]]=/ { sub("center[[:space:]]*=","",$4); print $4; }' 4, 5.243 'whitespace' bekommst du mit nem gsub("[[:space:]]","", $n) vor dem 'print' raus. Achso, obiges arbeitet noch Zeilenweise, wenn also "nach dem n-ten '|'" sich ab Textbeginn berechnet muß man noch den Record-Seperator setzen: awk 'BEGIN { RS="|"; FS="="; } NR == n { # gsub("[[:space:]]", "", $2); print $2; }' Die Lösung gefällt mir eigentlich sogar besser ;) HTH, -dnh -- == Re: MS' rules for creating 8.3's out of "long filenames" ==
Rules? There are *rules* for this? And there was I thinking it just inserted a few random characters based on your cat's star-sign, the number of milliseconds since your last bowel movement, and the instantaneous value of the Dow Jones Index! Nothing M$ makes is _that_ accurate. -- Tanuki, Shawn Latimer -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Donnerstag 10 September 2009 18:05:48 schrieb David Haller:
Hallo,
Am Don, 10 Sep 2009, Al Bogner schrieb:
Das darum herum muss egal sein. Es geht um die Suche wo "center=" ist. Eventuell könnte man das x. Vorkommen von | berechnen und dann mit cut -f - d"|" den Bereichen zwischen den | bestimmen und dann weiter mit cuf -f -d"=".
Das 'center=' ist immer nach dem n-ten '|'? Dann bietet es sich an awk zu verwenden.
Nein eben nicht, David! Wenn ich wüsste, dess es das n-te | ist, könnte ich doch einfach cut nehmen. Es klappt aber schon ganz gut. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Ich habe eine sehr lange Text-Variable (Text aus mehreren Seiten). Darin kommt an unregelmäßiger Stelle, aber ziemlich gegen Ende eine bestimmte Zeichenkombination von "|center=4,3 |" (ohne "). 4,3 ist variabel, der Rest konstant. Grenzen sind also |. Die Stelle ist aber nicht konstant, daher ist cut nicht möglich.
Wie bestimmte ich diesen Teil zB mit sed in einem bash-Skript?
Sowas wie echo $VAR | sed 's/.*\(|center=[0-9]+,[0-9]|+\).*/\1/' sollte meiner Meinung nach helfen. Ciao, Marko
Am Donnerstag 10 September 2009 15:54:49 schrieb Marko Käning:
Ich habe eine sehr lange Text-Variable (Text aus mehreren Seiten). Darin kommt an unregelmäßiger Stelle, aber ziemlich gegen Ende eine bestimmte Zeichenkombination von "|center=4,3 |" (ohne "). 4,3 ist variabel, der Rest konstant. Grenzen sind also |. Die Stelle ist aber nicht konstant, daher ist cut nicht möglich.
Wie bestimmte ich diesen Teil zB mit sed in einem bash-Skript?
Sowas wie
echo $VAR | sed 's/.*\(|center=[0-9]+,[0-9]|+\).*/\1/'
sollte meiner Meinung nach helfen.
Leider nein. Vermutlich liegt es daran, dass es auch zB "|center=4.1,3.2444 |" sein könnte. Die Stellen nach dem Dezimalpunkt sind unbestimmt oder eben gar keine. Meist gibt es aber Dezimalstellen. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Al Bogner, Donnerstag 10 September 2009:
Vermutlich liegt es daran, dass es auch zB "|center=4.1,3.2444 |" sein könnte. Die Stellen nach dem Dezimalpunkt sind unbestimmt oder eben gar keine. Meist gibt es aber Dezimalstellen.
Dann halt so: ...sed 's#.*|center=\([^|]*\)|#\1#' Erklärung: "center=" steht für sich. "[^|]*|" steht für Null oder mehr Nicht-|-Zeichen, danach ein |-Zeichen. Die Klammern außenrum nehmen den Ausdruck in den Puffer, und \1 gibt ihn anschließend aus. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Donnerstag 10 September 2009 16:32:11 schrieb Andre Tann:
Al Bogner, Donnerstag 10 September 2009:
Vermutlich liegt es daran, dass es auch zB "|center=4.1,3.2444 |" sein könnte. Die Stellen nach dem Dezimalpunkt sind unbestimmt oder eben gar keine. Meist gibt es aber Dezimalstellen.
Dann halt so: ...sed 's#.*|center=\([^|]*\)|#\1#'
Erklärung:
"center=" steht für sich. "[^|]*|" steht für Null oder mehr Nicht-|-Zeichen, danach ein |-Zeichen. Die Klammern außenrum nehmen den Ausdruck in den Puffer, und \1 gibt ihn anschließend aus.
Danke funktioniert. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Al Bogner [10.09.2009 16:22]:
Am Donnerstag 10 September 2009 15:54:49 schrieb Marko Käning:
Ich habe eine sehr lange Text-Variable (Text aus mehreren Seiten). Darin kommt an unregelmäßiger Stelle, aber ziemlich gegen Ende eine bestimmte Zeichenkombination von "|center=4,3 |" (ohne "). 4,3 ist variabel, der Rest konstant. Grenzen sind also |. Die Stelle ist aber nicht konstant, daher ist cut nicht möglich.
Wie bestimmte ich diesen Teil zB mit sed in einem bash-Skript? Sowas wie
echo $VAR | sed 's/.*\(|center=[0-9]+,[0-9]|+\).*/\1/'
sollte meiner Meinung nach helfen.
Leider nein.
Vermutlich liegt es daran, dass es auch zB "|center=4.1,3.2444 |" sein könnte. Die Stellen nach dem Dezimalpunkt sind unbestimmt oder eben gar keine. Meist gibt es aber Dezimalstellen.
Dann ändere doch die Regex. /.*\(|center=[^|]\+|\).*/ ist doch eine Annäherung, oder? Dein Beispiel wird jedenfalls gefunden: echo "Schmirschschmorsch |center=4.1,3.2444 | Pillepalle" | sed 's/.*\(|center=[^|]\+|\).*/\1/' |center=4.1,3.2444 | HTH, Werner -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi Werner, On Thu, 10 Sep 2009, Werner Flamme wrote:
Am Donnerstag 10 September 2009 15:54:49 schrieb Marko Käning:
echo $VAR | sed 's/.*\(|center=[0-9]+,[0-9]|+\).*/\1/'
ich sehe gerade, dass ich oben das Plus eh mit dem Balken vertauscht hatte. Dummer Typo...
echo "Schmirschschmorsch |center=4.1,3.2444 | Pillepalle" | sed 's/.*\(|center=[^|]\+|\).*/\1/' |center=4.1,3.2444 |
Hier finde ich spannend, dass Du das Plus escapst... Das ist bei sed offensichtlich notwendig!!! War mir NICHT bewusst... Warum eigentlich das? Gruß, Marko
Hallo, Am Don, 10 Sep 2009, Marko Käning schrieb:
On Thu, 10 Sep 2009, Werner Flamme wrote:
's/.*\(|center=[^|]\+|\).*/\1/' |center=4.1,3.2444 |
Hier finde ich spannend, dass Du das Plus escapst... Das ist bei sed offensichtlich notwendig!!! War mir NICHT bewusst... Warum eigentlich das?
sed verwendet basic-Regex, keine extended REs (neuere GNU sed haben allerdings die Option '-r'). Siehe 'man 7 regex'. -dnh -- A tangled cable is a happy cable. -- R. B. West -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Marko Käning [10.09.2009 16:50]:
Hi Werner,
On Thu, 10 Sep 2009, Werner Flamme wrote:
Am Donnerstag 10 September 2009 15:54:49 schrieb Marko Käning:
echo $VAR | sed 's/.*\(|center=[0-9]+,[0-9]|+\).*/\1/'
ich sehe gerade, dass ich oben das Plus eh mit dem Balken vertauscht hatte. Dummer Typo...
echo "Schmirschschmorsch |center=4.1,3.2444 | Pillepalle" | sed 's/.*\(|center=[^|]\+|\).*/\1/' |center=4.1,3.2444 |
Hier finde ich spannend, dass Du das Plus escapst... Das ist bei sed offensichtlich notwendig!!! War mir NICHT bewusst... Warum eigentlich das?
David hat es erklärt - erklären kann ich es nicht, aber als ich den LPIC-1-Kurs bei Peer Heinlein besucht habe, habe ich festgestellt, dass das Plus im Gegensatz zu allen anderen Sonderzeichen escaped werden muss - wir haben uns damals den Wolf probiert, es ging nicht ohne ;-) Gruß Werner P.S.: Sorry für die PM, habe ich erst beim Absenden bemerkt :-( P.P.S.: Sorry für die Verspätung, das Orginalmehl an die Liste wurde wegen temporärer Unzustellbarkeit permanent zurückgeschickt ;-) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (6)
-
Al Bogner
-
Andre Tann
-
David Haller
-
Joerg Thuemmler
-
Marko Käning
-
Werner Flamme