staging.inyokaproject.org

SED Suchen und Ersetzen - Erstes Zeichen der Suche Ersetzen

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

Kern

Anmeldungsdatum:
25. Februar 2020

Beiträge: Zähle...

Hallo zusammen,

ich möchte mittels SED folgendes umsetzen (Suchen und Ersetzen):

Ausgangstext: ,Hans

Soll werden zu: _Hans

Umsetzten könnte man dies so:

sed 's/,[AZ]/_/'

Dadurch wird allerdings auch der Buchstabe entfernt → _ans.

Wie kann ich nur das erste Zeichen meiner Suche ersetzen?

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wenn es nicht unbedingt sed sein muss, geht das z.B. so mit Perl:

perl -pane 's/,([A-Z])/_$1/g'

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Im Prinzip bei sed genauso, nur mit Backslash statt Dollar:

1
sed 's/,([A-Z])/_$1/'

Das g hinten, das ich weggelassen habe, steht für global, und würde alle Muster dieser Art in einer Zeile ersetzen, nicht nur das erste.

In der Anwendung übergibt man meist eine Datei, die geändert werden soll:

1
2
3
4
5
6
7
8
9
sed -r 's/,([A-Z])/_\1/' alt

sed -r 's/,([A-Z])/_\1/' alt > neu

cat alt | sed -r 's/,([A-Z])/_\1/' > neu

sed -ri 's/,([A-Z])/_\1/' alt

sed -ribak 's/,([A-Z])/_\1/' alt

Version 0 gibt die Änderung auf den Bildschirm aus, 1 schreibt sie in eine neue Datei, die Catversion macht das gleiche umständlicher, mit -i ändert man die Datei an Ort und Stelle (in place), -ibak erzeugt eine Sicherheitskopie der alten Datei mit der Endung bak.

1
2
sed -r 's/,([A-Z])/_\1/' alt > alt
cat alt | sed -r 's/,([A-Z])/_\1/' > alt

klappt nicht, weil eine neue Datei "alt" zum Schreiben geöffnet wird, die die alte Datei ersetzt, bevor sie gelesen wurde - das ist nicht spezifisch für sed, aber tritt bei sed als Problem für viele erstmalig häufig auf.

Kern

(Themenstarter)

Anmeldungsdatum:
25. Februar 2020

Beiträge: Zähle...

user_unknown

Hat geklappt. Danke für die ausführliche Erklärung.

Antworten |