2016-05-31 13 views
0
for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "s/var Handlebars/d" {}; done; 

Ich habe scheinbar alles versucht Semikolon Flüchten, einschließlich der ; nach dem {} entkommen, beide ; Flucht‘s, die Anführungszeichen zu entkommen, die sed Befehl zwicken - alle umsonst. Was gibt?Fund: fehlende Argument `exec‚ auch nach

Antwort

3

(... Verwenden Sie for i in ls nicht Es wird fehlschlagen, wenn eine Dateiname Leerzeichen enthält, und es ist unnötig for i in * tut genau das, was Sie wollen, ohne die Notwendigkeit eines subprocess)

Die korrekte Syntax ist:

for fn in *; do 
    find /path/ -name "$fn" -type f -exec sed ... {} \; ; 
done 

\; ist ein Argument zu finden. Sowohl {} als auch ; müssen als einzelne Argumente erscheinen. Wenn Sie {}\; verwenden, kombiniert die Shell diese zu einem Argument und find behandelt es als einfaches Argument für sed. Die zweite ; ist ein Shell-Metazeichen, das den Befehl find beendet. Geschrieben wie oben, in drei Zeilen, ist die ; nicht notwendig, aber wenn Sie einen Einzeiler wollen, wird es benötigt. Wenn Sie es entkommen, wie \;, hört es auf, ein Shell-Metazeichen zu sein, und wird einfach an find als ein Argument übergeben, wo es einen Fehler erstellen wird.

+0

'für i in \ 'ls \'; finde/pfad/-name $ i -type f -exec sed -i "s/var Lenker/d" {} \; ; fertig; 'Das scheitert auch für mich. – papiro

+0

@papiro Bitte lesen Sie meine Antwort erneut. Es erwähnt ausdrücklich diesen Fehler. – rici

+0

'für mich in \ 'ls \' 'funktionierte ganz gut für mich (keiner meiner Dateinamen enthielt whitespace). – papiro

2

Der Befehl sed wie beschrieben schlägt fehl, da sed zwei Argumente an den Befehl s erwartet. Versuchen Sie, alle Zeilen zu löschen, wo „var Lenker“ existiert, wenn ja, dann die richtige Art und Weise (mit sed) wird

sed '/^.*var Handlebars.*$/d' 

die „löschen (das‚d‘Befehl sed) sagt, jede Zeile, die die Zeichenfolge 'var Handlebars' enthält "

Die Anker^und $ sind Zeilenanfang bzw. Zeilenende, wobei '. *' null oder mehr Zeichen vor und nach dem 'var Lenker' bedeutet. Zeichenfolge.

so Ihre Verbindung Befehl wird jetzt:

for i in *; do find /path/ -name "$i" -type f -exec sed -i '/^.*var Handlebars.*$/d' {} \; done

+0

'sed -i"/var Lenker/d "' scheint gut zu funktionieren, um alle Zeilen zu löschen, die diese Zeichenfolge enthalten. – papiro

0

Die Emission war zweifach. Rici war richtig, dass es ein zusätzliches Semikolon geben musste, aber danach scheiterte es immer noch, es sei denn, ein Leerzeichen wurde zwischen dem {} und dem \; eingefügt. Der letzte Befehl sieht wie folgen aus:

for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "/var Handlebars/d" {} \;; done; 

Hinweis: Ich habe auch die s (Substitution) von dem sed Befehl pro Cwissy Kommentar entfernt.

+0

Ich habe klar gesagt, dass Sie nach dem {} ein Leerzeichen benötigen, und mein Beispiel zeigt das. Ich weiß nicht, was es bedeutet, Fragen zu stellen, wenn Sie nicht bereit sind, die Antworten zu lesen. – rici

+0

Ich sehe nicht, dass das Leerzeichen nach dem '{}' klar angegeben ist. In der Tat, nirgendwo in Ihrer Antwort erwähnt es den Raum. Das einzige, was in meinem Befehl fehlte, um den Fehler nicht zu verursachen, war das zusätzliche Semikolon (das du erwähnt hast) und das Leerzeichen. Alle anderen Informationen waren unnötig und verwirrten die Antwort noch weiter. – papiro

+2

"Beide {} und; müssen als einzelne Argumente erscheinen; wenn Sie {} \; verwenden, kombiniert die Shell diese zu einem Argument" – rici