PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie bringe ich sed bei, ob es den ersten oder letzten vorkommenden Char nimmt?



qeldroma
07-02-2007, 11:42
Hallo zusammen,

ich möchte mal bis zum ersten Vorkommen eines Zeichen und mal bis zum letzen sedden können. Beispiel:

Letztes Vorkommen:

$ echo "mein/pfad/zur/Datei/filename"|sed -e "s#.*/#+++#"
+++filename

Aber wie geht das erste Vorkommen?

$ echo "mein/pfad/zur/Datei/filename"|sed -e "s#??????#+++#"
+++pfad/zur/Datei/filename

Ich suche nach "/" und will mal bis zum ersten und mal bis zum letzen zusammenfassen. Erweitert könnte noch die Frage stehen, wie ich bis zum x-ten Vorkommen zusammenfasse? Geht das auch?

Ich weiß, daß ich das X-te Vorkommen ersetzen kann, z.B. nur den Part "zur/", jedoch das Übergreifende fehlt mir vom Wissen her...

Neugierige Grüße, Florian

qeldroma
09-02-2007, 11:50
Dazu keiner was?

michael.sprick
09-02-2007, 13:27
Das geht z. B. so...


echo "mein/pfad/zur/Datei/filename"|sed -e "s#[^/]*/#+++#"


In den [ ] definierst Du eine Zeichenklasse. Durch das ^ direkt hinter der öffnenden [ invertierst Du diese Zeichenklasse. Sie beinhaltet nun alle Zeichen - außer '/'.
Der Quantifier * erlaubt eine beliebige Anzahl an Vorkommen...

Dieser Ausdruck passt so auf alles, was vor dem ersten / kommt...

hth, michael

Thomas Engelke
14-02-2007, 11:15
Eigentlich geht dies trivial mit einem nichtgierigen Quantifizierer.

Der Ausdruck
.*/ ist gierig und findet so das letzte Vorkommen des Slash. Der Ausdruck
.*?/ ist genügsamer und macht damit den ersten Slash im String.

qeldroma
14-02-2007, 15:30
Eigentlich geht dies trivial mit einem nichtgierigen Quantifizierer.

Der Ausdruck
.*/ ist gierig und findet so das letzte Vorkommen des Slash. Der Ausdruck
.*?/ ist genügsamer und macht damit den ersten Slash im String.

Das scheint so nicht zu klappen:

$ echo "[Der] Fuchs springt - jetzt[oder?]jetzt"|sed -e "s/\].*?jetzt\[/ /"
[Der] Fuchs springt - jetzt[oder?]jetzt

Erwartet hätte ich jetzt:

[Der oder?]jetzt

intooblivion
14-02-2007, 19:15
hallihallo,

ich möchte etwas ähnliches machen, und zwar einen Dateinamen vom Anfang bis zu einem Leerzeichen abschneiden, dahinter ein '\' einfügen und dann den Rest des Strings wieder anfügen. Ist dies mit sed möglich?

mfg

michael.sprick
14-02-2007, 19:33
@queldroma: Damit der Quantifier tut, was Du willst, musst Du ihn escapen:



echo "[Der] Fuchs springt - jetzt[oder?]jetzt"|sed -e "s/\].*\?jetzt\[/ /"


@intoooblivion:


sed -e 's# #\\ #g'

ersetzt alle Leerzeichen gegen '\ '...

intooblivion
14-02-2007, 19:46
Hi danke,

ich hatte es auch gerade auf der englischen Wikipedia gesehen, sorry. :)

Eine Frage bleibt bei mir noch, nun angenommen ich habe
DATEI="1st_and_ 2nd_term"
und sage jetzt
filename=`echo $DATEI | sed 's/ \+/\\ /g'`

wieso sind meine Änderungen jetzt nicht in der neuen Variablen?

Sorry, ich bin nicht so der Profi in Shellskript, vielleicht liegt der Fehler auf der Hand...

mfg.

michael.sprick
14-02-2007, 19:53
Es kommt ein wenig drauf an, was danach mit dem String passiert...

Probier mal, ob folgendes bei Dir geht:


filename=`echo $DATEI | sed 's/ \+/\\\\ /g'`


Damit maskierst Du den Backslash auch noch... vier '\' werden zu zwei '\' und beim weiterverarbeiten werden zwei '\' zu einem - bleibt '\ ' übrig.... ;)

intooblivion
14-02-2007, 20:04
ach herrje ich guck schon viel zu lange drauf, vielen vielen dank! :)

intooblivion
14-02-2007, 20:32
Hi..

ich sollte meine Fragen zusammenfassen - ich weiß, ich bitte es zu entschuldigen... Ok, mein Skript ist komplett fertig, leider muss ich in dem Skript in ein Verzeichnis mit Leerzeichen wechseln, per sed habe ich es in eine Form gebracht, daß die Shell es schlucken müsste, tut sie aber natürlich nicht.

es sieht so aus:

nenpfad="/home/1st_and_ 2nd_term"
dateiname=`echo $nenpfad | sed 's/ \+/\\\\ /g'`
echo $dateiname
echo `ls -l $dateiname`

der dateiname auf den ich zugreifen will wird auch korrekt angezeigt, nur das ls -l macht mucken, "Directory not found"... Es greift wohl erst auf den ersten teil bist zum Leerzeichen zu und dann auf den zweiten teil...

hättet ihr vielleicht eine Idee?

EDIT: Mein Fehler, Beitrag kann gelöscht werden. Entschuldigung. :)

Blackhawk
15-02-2007, 09:48
echo `ls -l "$dateiname"`

?