sed - An Bestimmte Stellen Kommata setzen

S

stuxevara

Grünschnabel
Hallöchen,

ich möchte in einem Textfile mit Hilfe von sed an bestimmte Stellen ein Komma setzen.

Ich bin soweit, dass ich mit
Code:
sed 's/^\(.\)/\1;/' test.txt
nach der ersten Stelle ein Komma setze.

Das klappt, auch wenn nach an der zweiten Stelle ein Komma einfügen möchte, kann ich das ja mit
Code:
sed 's/^\(..\)/\1;/' test.txt
machen.

Soweit, so gut ... nun möchte ich aber gern die Anzahl der Stellen in einer Zahl angeben, da ich unter anderem auch an der 352. Stelle ein Komma brauche.

Und genau da hört es bei mir auf. Meine bescheidenen RegEx-Kenntnisse sagen mir, dass ich Spannen mit den geschweiften Klammern angebe.

Aber das schaffe ich nicht wirklich einzubauen und hoffe auf Eure Hilfe.
 
Da braucht man die Variablen-Substitution der benutzten shell. Da die shell die Variable im gleich folgenden sed-Ausdruck Substituieren soll, darf man keine single-, sondern muss double-quotes (afaik) verwenden:
Code:
stelle=4
echo 'blaaaaa blub'|sed "s/^\(.\{${stelle}\}\)/\1;/"

edit: außerdem ist das ein Semikolon und kein Komma :/
 
Zuletzt bearbeitet:
Vielen Dank - klappt und verstanden hab ichs auch :)

Ich erlaube mir noch eine zusätzliche Frage: Kann man mit einem Schwung mehrere Semikola setzen?Also an die Stelle 4,8,50 und 90 zB

{a,b} würde ja einen Bereich angeben.


Kriegt man das mit einem Ausdruck hin oder muss ich das dann mit einer Schleife (o.ä.) lösen?

PS: Natürlich meinte ich Semikolon 8)
 
Naja, du könntes das schon in einen Ausdruck 'prügeln', aber dann wäre die Anzahl der Kommata (oder Semikola) fix und nicht variabel, was du wahrscheinlich willst. Deswegen wäre eine Schleife wohl besser.
Du kannst auch mehrere sed-Kommandos einfach pipen. Bedenke: wenn du an Stelle 50 ein Komma setzen willst und bereits an Stelle 2 eins gesetzt hast, so must du Stelle 51 nehmen, weil ein Zeichen dazugekommen ist.

Das mit dem Bereich wird so nicht klappen, weil ein Bereich halt genau _einmal_ matcht, und dann kannst du auch nur einmal ein Komma einfügen. Du kannst natürlich mehrere Bereiche machen etc., aber das hab' ich oben ja schon angerissen.

Ein Beispiel:
Code:
line='hihi und blub'
for i in 4 9 15
    do
        line=$(echo $line|sed "s/^\(.\{${i}\}\)/\1;/")
    done

echo $line
 
Zuletzt bearbeitet:

Ähnliche Themen

[PERL] Mit Regex kompletten String durchsuchen und ersetzen

Java Development Kit Installation

Zurück
Oben