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

problem mit sed

hi,

würde gerne folgenden ausdruck bearbeiten :
habe foldende zeile :
location : #Restaurant# ort : #Frankfurt# strasse : #Hanauer Landstr.#

und hätte gerne diese Ausgabe:
Restaurant Frankfurt Hanauerlandstr.

also alles was zwischen #...# steht.

Code:
sed -e 's/^.*\#\(.*\)\#.*$/\1/g'

bekomme mit meiner anweisung leider nur den ersten ausdruck heraus : Frankfurt

über einen tipp bin ich euch dankbar

gruß flyingt
 
Da stimmt einiges nicht. Wenn ich das probiere, dann erhalte ich "Hanauer Landstr.". Das liegt daran, dass das erste ".*" so viele Daten aufnimmt, wie möglich. Hier also "location : #Restaurant# ort : #Frankfurt# strasse : ". Dann kommt ein "#", danach wird "Hanauer Landstr." mit den runden Klammern gemerkt, dann kommt ein "#" und anschließend das Ende. Dieser ganze String wird durch den in \1 gespeicherten String ersetzt, also der ganze Text durch "Hanauer Landstr."

Stattdessen könntest du beispielsweise nach den Teilen mit dem Doppelpunkt suchen, und die ersetzen. Und verwende "[^#]*", um ein größtmögliches Stück zu erwischen, das kein "#" enthält.
 
notoxp schrieb:
Und als Ergänzung: awk kann das auch
Code:
echo a#b#c#d#e#f | awk 'BEGIN { FS="#" } { print $3 }'

stimmt, awk kann es, aber so löst Du nicht ide hauptfrage des Threadstarters ;)

Code:
$ echo "location : #Restaurant# ort : #Frankfurt# strasse : #Hanauer Landstr.#" | awk -F "#" '{print $2, $4, $6}'
so schon ;)
 
Nochmal ein kleiner Tipp: Das Zeichen "#" als Feldtrenner für Adressen finde ich ziemlich ungünstig. Wenn man eine große Menge Adressen verarbeitet, die von Datentypisten eingegeben wurden, hat man oft "#" als Typo (wahrscheinlich beim Enter-Drücken passiert).

Wenn man unbedingt einen Feldtrenner benutzen muss, ist in der Regel ein Horizontal TAB günstiger. Denn der Tabulator ist meist nur schwer als Inhalt in ein Eingabefeld reinzukriegen.

Und was immer hilft: Die Feldtrenner pro Datensatz nachzählen.
 
Hey, macht mir einen sed-Neuling nicht mit anderen Tools abspenstig ;-)

echo "location : #Restaurant# ort : #Frankfurt# strasse : #Hanauer Landstr.# " |
sed -e "s/^[^#]*#\([^#]*\)#[^#]*#\([^#]*\)#[^#]*#\([^#]*\)#/\1 \2 \3 /"


"Aufgedröselt:"

^=> Zeilenanfang
[^#]* Alles ausser "#" beliebig oft ( wech mit location )
# Feldtrenner
\([^#]*\) => alles ausser "#", durch \( \) referenzierbar als "\1" (Restaurant )
# Feldtrenner
[^#]* Alles ausser "#" beliebig oft ( wech mit ort )
\([^#]*\) => alles ausser "#", durch \( \) referenzierbar als "\2" => Frankfurt
# Feldtrenner
....
\1 \2 \3 => \( ... \) \(... \) \(....\) von oben ausgeben.

Haveaniceday

Edit: Sieht bestimmt noch doller aus, wenn man mit einer Variablen den Feldtrenner ersetzt. So O="#" => $O
*grins*
 
haveaniceday schrieb:
Hey, macht mir einen sed-Neuling nicht mit anderen Tools abspenstig ;-)
[...]
*grins*

lass den Jung mal das Beste Werkzeug für den Job nehmen ;) bei so einer Aufgabe würde ich zu perl oder awk greifen, auch wenn ich sed liebe ...
 
guten morgen,

haveaniceday schrieb:
echo "location : #Restaurant# ort : #Frankfurt# strasse : #Hanauer Landstr.# " |
sed -e "s/^[^#]*#\([^#]*\)#[^#]*#\([^#]*\)#[^#]*#\([^#]*\)#/\1 \2 \3 /"

*grins*

vielen dank, sieht gut aus
 
Oben