• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

AWK oder SED?

daliman

Member
Vielleicht kann mir jemand bei der Lösung eines Riesenproblems helfen. Mit SED ist man in der Lage eine Datei einzulesen, zu verändern und dann auszugeben. Ich komme mit den Dokus nicht zurecht. Folgendes Problem:

1.)Eingabestring ist xyz-abc.h
2.) sed(awk) soll den Teil, einschließlich - löschen.
3.) Den Teil ab dem Punkt auch löschen.
4.) Ausgabestring wäre dann: abc.

Wahrscheinlich ein kleiner Schritt für sed´ler, aber eine riesengroßer für mich.

Gruß, DaLiMan.de
 
OP
D

daliman

Member
Problem hat sich erledigt. Beim Versuch direkt nach dem Mailen ging es dann.

cat dat|sed -e 's/xyz-//' >dat2
cat dat2|sed -e 's/.h//' >dat3

dat3=abc

Jetzt muß man es nur noch in eine Zeile kriegen ...

Gruß, DaLiMan.de
 
Achte bei "." darauf diesen zu maskieren, wenn du den Punkt meinst.
Sonst wird "." für beliebiges Zeichen genutzt.

cat dat2|sed -e 's/\.h//' >dat3

echo aha.h | sed 's/.h/oh/'
oha.h

echo aha.h | sed 's/\.h/oh/'
ahaoh

Haveaniceday

[erklärungen]
Edit: Und als "Fortgeschrittener" sieht das dann so aus: *grins*
echo "xyz-abc.h" | sed -e "s/^[^-]*-\(.*\)\.h$/\1/"
  • s/von/nach/ ersetze "von" durch "nach"
  • ^[^-]* => 1. ^: vom Anfang [^-]* : Beliebig oft, solange kein "-" kommt
  • -\(.*\) => -: Genau das Zeichen "-" \(<inhalt>\): Markieren, 1. Klammer kann später als "\1", 2. Klammer als "\2"... referenziert werden.
  • /\1/ => ersetzen durch den Inhalt der ersten "\(...\)"
\.h$ => genau ".h" am Ende
[/erklärungen]
 
Wenn nur ein "-" und ein "." vorkommt kann man es auch so performanter machen:

cat dat | cut -d. -f 1 | cut -d- -f2

@jengelh,
solange perl nicht auf allen Unix-Derivaten und auch "embedded" Boxen
mit z.B. busybox drin ist nutze ich lieber schöne alte Befehle.
Und eine kleines sed ist schon tolerierbar ;-)

@daliman
mit "-e" kann man in der Regel mehrere Befehle beim sed zusammenfassen.

cat dat | sed -e 's/xyz-//' -e 's/\.h//' > dat2
Bei neueren sed kann man auch in der Datei direkt ersetzen.
sed -i -e 's/xyz-//' -e 's/\.h//' dat

Haveaniceday
 

TeXpert

Guru
es kommt natürlich immer auf die genauen Umstände an :) wo kommen die Namen her wie werden die verarbeitet, aber dieses kleine Problemchen kann die Bash auch ganz alleine lösen:

Code:
$ A="foo-bar.h"
$ t=${A#*-} ; echo ${t%\.*}
bar
 

regexer

Advanced Hacker
TeXpert schrieb:
Code:
$ A="foo-bar.h"
$ t=${A#*-} ; echo ${t%\.*}
bar
Du wirst es mir nicht glauben, aber ich wollte auch diese Bash-Lösung präsentieren. Für den Fall, dass man UNIXer ist, und keine Bash zur Hand hat, könnte man sich auch mit cut -d ... behelfen.
 

TeXpert

Guru
notoxp schrieb:
TeXpert schrieb:
Code:
$ A="foo-bar.h"
$ t=${A#*-} ; echo ${t%\.*}
bar
Du wirst es mir nicht glauben, aber ich wollte auch diese Bash-Lösung präsentieren.

:) doch ich glaube es Dir....

BTW: ich mach sowas immer in 2 Schritten, hast Du es schon mal geschafft, sowas in einem zusammen zubauen? die sinnvollen Kombinationen wären IMHO ja:


Code:
$ echo ${${A%\.*}#*-}
bash: ${${A%\.*}#*-}: bad substitution
$ echo ${{A%\.*}#*-}
bash: ${{A%\.*}#*-}: bad substitution
aber das will wohl nicht :) und da bin ich bis jetzt noch nicht dazu gekommen mir das mit der manpage zu erklären
 
Die Echolösung/Bashlösung hatte ich wegen "cat file | " nicht angeboten.
Dann wäre noch zusätzlich ein "cat file | while read a ; do..." notwendig.

;-)

Haveaniceday
 

regexer

Advanced Hacker
TeXpert schrieb:
Code:
$ echo ${${A%\.*}#*-}
bash: ${${A%\.*}#*-}: bad substitution
$ echo ${{A%\.*}#*-}
bash: ${{A%\.*}#*-}: bad substitution
aber das will wohl nicht :) und da bin ich bis jetzt noch nicht dazu gekommen mir das mit der manpage zu erklären
Hmmm. Das Ausdruck wird doch von der Shell wiefolgt evaluiert:
Step 1: ${${A%\.*}#*-}
Step 2: ${foo-bar#*-}
Step 3: --> foo-bar kenne ich nicht, da kein Varialbenname. Oder ist foo-bar ungültig, da ein minus im Namen? Müsste ich auch nachsehen...

Ich würde also mal auf die schnelle Behaupten, dass das so nicht möglich ist... Gegenbeweise sind stets willkommen.
 

TeXpert

Guru
notoxp schrieb:
Das Ausdruck wird doch von der Shell wiefolgt evaluiert:
Step 1: ${${A%\.*}#*-}
Step 2: ${foo-bar#*-}
Step 3: --> foo-bar kenne ich nicht, da kein Varialbenname.
nach etwas Nachdenken würde ich Dir hier soweit zustimmen :)

Oder ist foo-bar ungültig, da ein minus im Namen? Müsste ich auch nachsehen...
nö, warum, Trennstriche sind zugelassene Zeichen in Namen.
 

TeXpert

Guru
mir ist gerade noch eine alternative Lösung eingefallen :)

Code:
awk 'BEGIN{FS="[-.]"} { print $2;}' foobar.txt
dabei stehen die gesuchten Dateinamen "foo1-bar1.h" bis "foon-barn.h" in foobar.txt, durch ändern des Fieldseparators kommt man bequem an die einzelnen Teile und dann halt nur das 2. Feld ausgeben...
 

regexer

Advanced Hacker
TeXpert schrieb:
nö, warum, Trennstriche sind zugelassene Zeichen in Namen.
Darum.
Code:
~> bla-laber=asdf
-bash: bla-laber=asdf: command not found
~> echo $bla-laber
-laber
~> echo ${bla-laber}
laber
Ich schließe jedoch nicht aus, dass ich im Moment ein Brett vor dem Kopf habe...
 

TeXpert

Guru
nein, ich hab kurzschlussartig an Filenames gedacht, für Variablen-identifer ist '-' nicht zulässig :)

man bash schrieb:
name A word consisting only of alphanumeric characters and underscores, and beginning with an
alphabetic character or an underscore. Also referred to as an identifier.
 
Oben