Ack-grep ersetzt einen String aus mehreren Wörtern

1776
Bentley4

Der folgende Befehl ersetzt jedes Vorkommen des Wortes fromin einer beliebigen Datei des aktuellen Verzeichnisses oder seiner Unterverzeichnisse durch to:

ack-grep -l --print0 --text from | xargs -0 -n 1 sed -i -e 's/from/to/g' 

Ich habe das aus diesem Thread bekommen.

Wie ersetze ich eine Zeichenfolge, die mehrere Wörter anstelle eines Wortes enthält? Zum Beispiel ersetzen laughing babiesdurch smiling little children.

Ich habe folgendes versucht, aber diese haben nicht funktioniert:

ack-grep -l --print0 --text 'laughing babies' | xargs -0 -n 1 sed -i -e "s/'laughing babies'/'smiling little children'/g" ack-grep -l --print0 --text 'laughing babies' | xargs -0 -n 1 sed -i -e 's/"laughing babies"/"smiling little children"/g' 

Ich weiß nicht, ob es wichtig ist, aber ich bin dabei Ubuntu 11.10.

3

1 Antwort auf die Frage

3
terdon

Sie brauchen die Anführungszeichen eigentlich nicht, sedkönnen mit Leerzeichen umgehen, und die Anführungszeichen werden als Teil des Musters betrachtet (es sei denn, Sie entgehen ihnen). Mach einfach das:

ack-grep -l --print0 --text 'laughing babies' | xargs -0 -n 1 sed -i -e 's/laughing babies/smiling little children/g' 

Ich verstehe nicht, warum Sie das grepTeil wollen, Sie könnten einfach sedalle Dateien des Verzeichnisses direkt ausführen, sedist schnell:

sed -i -e 's/laughing babies/smiling little children/g' * 
Weil ack-grep bestimmte Dateien wie die in .git in seiner Suche auslässt. Aber das sed-Kommando ist trotzdem gut zu wissen, danke! Bentley4 vor 11 Jahren 0