2016-08-30 1 views
0

Ich habe ersetzen folgenden StringSuchen und Ersetzen String aus Textdatei Ubuntu

//@Config(manifest 

mit unten string,

@Config(manifest 

Also dem i regex folgenden erstellt

\/\/@Config\(manifest 

und versuchte,

grep -rl \/\/@Config\(manifest . | xargs sed -i "\/\/@Config\([email protected]\(manifest/g" 

Aber ich bin nach Fehlern bekommen:

sed: -e expression #1, char 38: Unmatched (or \(

Ich habe rekursiv suchen und diesen Vorgang zu tun, obwohl ich mit obigen Fehlern steckte.

+0

warum zusätzliche 'manifest $'? – piyushj

+0

Diese Waas versehentlich hinzugefügt, entfernt es obwohl immer noch den gleichen Fehler –

+0

können Sie den Fehler sogar auf neue zu aktualisieren, wie der Char-Wert wird – piyushj

Antwort

2
grep -rl '//@Config(manifest' | xargs sed -i 's|//@Config(manifest|@Config(manifest|g' 
  • Angabe . für aktuelle Verzeichnis ist optional für grep -r
  • sed erlaubt Jedes andere Zeichen als Backslash oder Newline als Trennzeichen verwendet werden

bearbeiten

Ob Dateiname Leerzeichen enthält, verwenden

grep -rlZ '//@Config(manifest' | xargs -0 sed -i 's|//@Config(manifest|@Config(manifest|g' 

Erklärung (übernimmt GNU-Version von Befehlen)

  • grep

    • -r führt rekursive Suche
    • -l Option Ausg UTS nur Dateinamen statt abgestimmte Muster
    • -Z gibt ein Null-Byte (ASCII NUL-Zeichen) nach jedem Dateinamen anstelle der üblichen Newline
    • 'pattern' standardmäßig grep verwendet BRE (Grund regulärer Ausdruck), wo die Zeichen wie ( tun haben keine besondere Bedeutung und daher nicht sein müssen entkommen
  • xargs -0xargs Argumente der ASCII NUL-Zeichen zu trennen sagt

  • sed

    • -i Inplace bearbeiten, -i.bkp verwenden, wenn Sie ein Backup der Originaldateien
    • s|pattern|replace|g die g Flag teilt sed suchen und ersetzen alle Vorkommen erstellen möchten. sed ist ebenfalls standardmäßig auf BRE eingestellt, und daher muss ( nicht entfernt werden. \( Mit würden Beginn der Einfanggruppen bedeuten und damit die Fehler, wenn er nicht die Schließung findet \)
+0

es funktioniert nicht für rekursive Verzeichnisse wenn irgendein Verzeichnis Platz in seinem Namen hat –

+1

Danke, es hat funktioniert, obwohl es großartig wäre, wenn du den Befehl in der Antwort erklärst, damit andere es leicht verstehen können und es auch die Antwortqualität verbessert –

+1

Danke für die Verbesserung der Qualität der Antwort, Es würde so vielen in Zukunft helfen. –