Ich versuche genau herauszufinden, was die folgende Shell-Skriptzeile macht:
grep --files-with-matches '>' . | sort | uniq | xargs perl -pi~ -e 's/9Kp/9K /' /home/user/DATAFILE.DAT
Ich bin ziemlich sicher, dass es versucht, eine globale Suche nach „9Kp“ durchzuführen und es in der angegebenen Datendatei durch „9K“ zu ersetzen. Mir ist jedoch nicht klar, was der Grep-Befehl vorher macht.
Antwort1
grep --files-with-matches '>' .
Suche >
im aktuellen Verzeichnis ( .
) und drucke nur die Dateinamen der passenden Dateien ( --files-with-matches
).
Beachten Sie, dass grep
nicht zurückkehrenirgendetwaswenn Sie ihm ein Verzeichnis ( .
) geben, aber vergessen, den "rekursiven" Modus zu aktivieren. Der richtige Befehl wäre
grep --files-with-matches --recursive '>' .
oder einfach
grep -Rl '>' .
| sort
| uniq
Sortieren Sie die Ergebnisse und entfernen Sie Duplikate.
| xargs perl -pi~ -e 's/9Kp/9K /' /home/user/DATAFILE.DAT
Führen Sie den angegebenen Befehl ( perl ...
) mit jedem Wort 1 von stdin aus, das als zusätzliche Argumente übergeben wird.
Alle Ergebnisdateien grep
sowie die /home/user/DATAFILE.DAT
Datei selbst werden aktualisiert, indem der Text " 9Kp
" durch " 9K
" ersetzt wird. Die alten Dateien werden mit einer abschließenden Tilde gesichert.
1 Hinweis:Wort, nichtLinie. Das bedeutet, dass ein Dateiname mit Leerzeichen als mehrere Namen behandelt wird. xargs -d'\n'
wäre besser, aber nicht perfekt.