2013-01-21 20 views
6

Ich versuche, eine Regex-Ausdruck zu schreiben, um ein oder mehrere '+' Symbole in einer Datei mit einem Leerzeichen zu ersetzen. Ich habe versucht, die folgenden:Ersetzen Sie ein Regex-Muster mit awk

echo This++++this+++is+not++done | awk '{ sub(/\++/, " "); print }' 
This this+++is+not++done 

Erwartet:

This this is not done 

Irgendwelche Ideen, warum dies nicht funktioniert?

Antwort

8

Verwenden gsub die globale Substitution tut:

echo This++++this+++is+not++done | awk '{gsub(/\++/," ");}1' 

sub Funktion nur erstes Spiel ersetzt, alle Spiele gsub verwenden zu ersetzen.

+1

Vielen Dank! –

2

Sie könnten auch sed verwenden.

echo This++++this+++is+not++done | sed -e 's/+\{1,\}/ /g' 

Dies entspricht einem oder mehreren + und ersetzt sie durch ein Leerzeichen.

5

Oder der tr Befehl:

echo This++++this+++is+not++done | tr -s '+' ' ' 
+0

'-s' ist sehr praktisch. Ich würde sagen, das ist die bessere Lösung für die Einfachheit. – alex

+0

Danke! Ich finde, dass "tr" ein sehr unterschätzter Befehl ist. – radical7

+0

Das ist einer ist cool. – Suku

4

Versuchen Sie, diese

echo "This++++this+++is+not++done" | sed -re 's/(\+)+/ /g'

4

Die idiomatische awk Lösung nur sein würde, um das Eingabefeld Separator mit dem Ausgang Separator zu übersetzen:

$ echo This++++this+++is+not++done | awk -F'++' '{$1=$1}1' 
This this is not done 
-1
echo "This++++this+++is+not++done" | sed 's/++*/ /g' 
+0

Dies beantwortet die Aufgabe in der ersten Zeile der Frage. –

0

Wenn Sie Zugriff auf Knoten auf Ihrem Computer haben, können Sie es tun, indem rexreplace

npm install -g regreplace 

Installation und dann

rexreplace '\++' ' ' myfile.txt 

Of laufen, wenn Sie mehrere Dateien in einem Verzeichnis haben data Sie

tun können
rexreplace '\++' ' ' data/*.txt 
+0

Wenn Sie die Größe von npm mit awk vergleichen und wie schnell tr ​​im Vergleich zu rexreplace ersetzt werden kann, dann können Sie verstehen, dass dies eine Bombe ist, um eine Nuss zu öffnen. –

+0

Es macht keinen Sinn, npm mit awk zu vergleichen. Ich nehme an, du meinst die Größe von rexreplace. Die Geschwindigkeit ist mit tr sicher besser. Die Antwort versucht, die Bequemlichkeit eines Werkzeugs zu bieten, in dem die Syntax leichter zu verstehen ist. Es erinnert mich an die Diskussionen, als C eingeführt wurde, und die Leute argumentierten, dass der generierte Code im Vergleich zur Assembly chaotisch und langsam war. – mathiasrw

Verwandte Themen