2016-08-08 9 views
0

Wie im Titel - Ich muss alle Dateien mit bestimmten Namen suchen und durchlesen, überprüfen Sie 7. Zeile für bestimmte Muster und wenn gefunden - Print-Pfad oder ersetzen Sie die Zeile .
Ich habe ein Problem mit der Pipe oder Exec-Ausgabe von awk.
find . -name "meta" -exec awk 'NR==7 && /T/' {} \;Drucken bestimmte Zeile und wenn es Platz enthält - ersetzen oder drucken Pfad

Wie Pipeline-Ausgabe dieses Befehls, oder verwenden Sie -exec auf es?

+1

'Pfad drucken oder die Zeile ersetzen '? Welche Aktion möchten Sie erreichen? und was ist das Muster zu suchen? – Inian

+0

Muster - '/ T/'- Zeile enthält T innen. Ich möchte den Pfad der Datei, von der diese Zeile gedruckt wurde, drucken oder diese Zeile in der Datei ersetzen. – DzikiChrzan

+0

Es kann "01 Jan 1970" sein, es ist nicht wichtig, welches Muster zu ersetzen ist. – DzikiChrzan

Antwort

2

Ändern Sie das Awk-Skript, um den Dateinamen zu drucken.

find ... -exec awk 'NR==7 && /T/ { print FILENAME }' {} \; 

oder alternativ einen Exit-Code verwenden, das Ergebnis zurück zu find

find ... -exec awk 'NR==7 { exit($0~/T/) }'() \; -o -ls 

Sie darauf achten müssen, um signalisieren den gleichen Exit-Code haben, wenn die Datei zu kurz ist; Deshalb benutze ich einen leicht gegenläufigen, nicht null (Fehler) Exit-Code für den Fall, dass eine Übereinstimmung gefunden wurde.

Wenn Sie die Zeile mit der Übereinstimmung ersetzen möchten, könnte sed -i sowohl einfacher als auch tragbarer sein, obwohl GNU Awk auch eine --inline Option hat.

find ... -exec sed -i '7s/.*T.*/foobar/' {} \; 

Beachten Sie, dass Sie sed -i '' '7s... auf * BSD-Plattformen benötigen, einschließlich OSX (das heißt die -i Option erfordert eine verbindliche Option Argument, es einen leeren String nicht Dateien sichern).