Pipe durch sed
, wie
echo "abc,,,def" | sed 's/,/|/g'
aber ich würde empfehlen zu verwenden
tr ',' '|'
in diesem Fall.
Ich muss einen sich wiederholenden Satz von Zeichen (2 oder mehr) durch die genaue Anzahl der Ersatzzeichen ersetzen. Ich muss dies entweder mit sed oder in vi tun.
Beispiele
"abc,,,def" becomes "abc|||dev" "1245d,,,,,22" becomes "1245d|||||22"
Vielen Dank
Pipe durch sed
, wie
echo "abc,,,def" | sed 's/,/|/g'
aber ich würde empfehlen zu verwenden
tr ',' '|'
in diesem Fall.
Entschuldigen Sie, dass ich nicht kommentiert habe. Ich habe keinen guten Ruf.
Diese Lösung schlägt fehl, wenn mehr Muster vorhanden sind, wie z abc,,,def,g
.
sed -n 's/[^,],,/&/;tsubs;p;d;:subs s/,/|/g;p' <<<'abc,,,def abc,,def abc,,,def,g abc,def'
Dies ist praktisch unmöglich, da reguläre Ausdrücke funktionieren. Wie bereits in jvb dargelegt, ist eine Lösung einfach (wenn auch nicht notwendigerweise kurz), wenn die maximale Anzahl aufeinanderfolgender Quellzeichen bekannt ist. Wenn nicht, können Sie zuerst alle Quellzeichen ändern und dann die einzelnen Zeichen in einem zweiten Schritt zurücksetzen. Dies funktioniert jedoch nur, wenn das Zielzeichen nicht im Eingabestrom vorkommt oder wenn Sie ein Zeichen verwenden können, von dem bekannt ist, dass es nicht im Eingabestrom als Zwischenziel vorkommt.
Außerdem müssen Sie die Eckfälle eines einzelnen Quellzeichens berücksichtigen, die am Anfang oder am Ende der Zeile vorkommen. Somit:
tr ',' '|' < file | sed 's/\([^|]\)|\([^|]\)/\1,\2/;s/^|\([^|]\)/,\1/;s/\([^|]\)|$/\1,/'
oder
sed 's/,/|/g;s/\([^|]\)|\([^|]\)/\1,\2/;s/^|\([^|]\)/,\1/;s/\([^|]\)|$/\1,/' file
Eine Lösung, die eine Sprache verwendet, die die Länge der Zeichenkette kennt, wäre robuster.