Hier ist mein Befehl (absichtlich brechen):
grep FOO "/Users/gjtorikian/blah" -l | xargs sed -i '' '/FOO/{s/FOO/BAR/g; w /dev/stdout
}'
Auf hoher Ebene: grep
für FOO im blah
Verzeichnis; Pipe in nur den Dateinamen (wegen -l
) zu sed
; sed
führt ein Inline-Ersetzen ( -i ''
) durch und druckt nur den geänderten Begriff an /dev/stdout
.
Wenn ich das -l
und die Pipe weglassen würde , bekomme ich dies zurück von grep
:
/Users/gjtorikian/blah/baz.cs:1:FOO
/Users/gjtorikian/blah/bar.js:1:FOO
Ich möchte sed
das Inline-Ersetzen durchführen und mir dann die ersetzte Datei und den ersetzten Begriff anzeigen. zum Beispiel:
/Users/gjtorikian/blah/baz.cs:1:BAR
/Users/gjtorikian/blah/bar.js:1:BAR
Ist so etwas möglich? Wenn es darauf ankommt, würde ich es vorziehen, es nur mit grep
/ zu behalten sed
. Muss ich eine Sekunde grep
nach dem machen sed
?
''
, das ist die Standardeinstellung.''
ist dies nicht die Standardeinstellung.Antworten:
Eine Möglichkeit wäre, die Ausgabe
grep
an einen separatensed
Filter weiterzuleiten .Sie können
sed
die Zeilennummer (mit dem=
Befehl) drucken lassen, wenn eine Übereinstimmung gefunden wird, und eine weitere Nachbearbeitung durchführen.Es wäre wahrscheinlich klarer, awk zu verwenden.
quelle
Da ich kein englischer Muttersprachler bin, habe ich es wahrscheinlich nicht verstanden.
Um ein Verzeichnis zu "grep", benötigen Sie "-r". Die Verwendung von '-l' druckt nur den Dateinamen und hört nach dem ersten Auftreten auf zu greifen.
quelle
Ich denke, Sie machen das Problem zu kompliziert, indem Sie versuchen, es auf einmal zu tun. Sie können einfach eine tun
um die Liste der Dateien mit Zeilennummern und Ersetzungen zu erhalten (dies sollte funktionieren, solange Ihre Dateinamen keine Doppelpunkte enthalten, aber das ist unter Mac OS trotzdem eine schlechte Idee ...). Anschließend können Sie eine ausstellen
Hier wird kein grep und xarg benötigt (Sie können ein "find ... | xarg" durchführen, wenn Sie jedoch viele Dateien haben). Wenn Sie über die Duplikate besorgt sind, können Sie die beiden Zeilen in ein Skript oder eine Funktion einfügen und dort Variablen ersetzen.
quelle
sed -i ...
Ändert die Dateizeiten, auch wenn der Stream unverändert bleibt.sed
ein Stream-Editor kein Datei-Editor ist, sodass die-i
Option gegen die Unix-Philosophie verstößt ( mywiki.wooledge.org/BashFAQ/021#Using_nonstandard_tools ). Wenn Sie diese Verwendung vermeiden möchtenex
(zex -sc '%s/FOO/BAR/ge|x' /Users/gjtorikian/blah
. B. ).Ersetzen Sie FOO rekursiv durch BAR im aktuellen Verzeichnis (leiser Modus).
quelle
Einzeiler
quelle