Verwenden Sie den Befehl sed, um zwischen den Zahlen erscheinende zu ersetzen

Verwenden Sie den Befehl sed, um zwischen den Zahlen erscheinende zu ersetzen

Ich habe eine CSV-Datei, in der die Daten das folgende Format haben

|001|,|abc,def|,123456,789,|aaa|,|bbb|,444,555,666

Ich möchte nur die ",", die zwischen Zahlen erscheinen, durch ein anderes Zeichen ersetzen, beispielsweise SOH oder $ oder *

andere ",", die in der Zeile erscheinen, sollten nicht ersetzt werden, d. h. um zu sagen, dass ich folgende Ausgabe haben möchte

|001|,|abc,def|,123456*789,|aaa|,|bbb|,444*555*666

Kann mir bitte jemand mit dem sed-Befehlsmuster helfen, um die oben gewünschte Ausgabe zu erhalten

Antwort1

Versuche dies

sed 's/\([0-9]\),\(-\?[0-9]\)/\1\*\2/g'

Der erste Abschnitt entspricht einer Ziffer, gefolgt von einem Komma, gefolgt von einer Ziffer oder einem -. Der nächste Abschnitt wiederholt einfach die erste Ziffer, das Ersatzzeichen und dann die letzte Ziffer.

Dadurch werden alle Muster wie „#,#“ oder „#,-#“ erkannt, auch einige, die möglicherweise nicht erwünscht sind (z. B. „abc123,-def“ --> „abc123*-def“). Um dies zu beheben, sind weitere Kenntnisse des Eingabestroms erforderlich. (Weitere Einzelheiten finden Sie in den Kommentaren.)

Antwort2

Folgendes scheint zu funktionieren:

sed 's/\([0-9]\),\([-0-9]\)/\1\*\2/g'

verwandte Informationen