Ich schreibe ein Skript und möchte überprüfen, ob die erste Zeile der Datei mit einem bestimmten Muster übereinstimmt. Wenn dies der Fall ist, wird die Datei ausgedruckt. Wie kann ich das erreichen?
Wie überprüfe ich das Muster? Gibt es eine Möglichkeit, nach Mustern zu suchen und basierend auf der Ausgabe etwas zu tun?
BEARBEITEN: Bitte werfen Sie einen Blick auf diese Frage: /programming/5536018/how-to-get-match-regex-pattern-using-awk-from-file
Ich möchte so etwas, aber keiner von ihnen hat für mich gearbeitet. Grundsätzlich möchte ich überprüfen, ob die erste Zeile mit einem Regex-Muster übereinstimmt oder nicht, und auf dieser Grundlage die Dateizeilen drucken.
Antworten:
Sie könnten das tun mit
ed
:Der Trick hier ist , um zu versuchen zu ersetzen
PATTERN
auf1st
Linie mit sich selbst.ed
wird ein Fehler ausgegeben, wenn das angegebene Muster nicht gefunden werden kann. Die,p
gesamte Datei (Drucken der gesamten Datei) wird nur ausgeführt, wenn dies1s/PATTERN/&/
erfolgreich ist.Oder mit
sed
:Dies
q
gilt, wenn die erste Zeile nicht (!
) übereinstimmtPATTERN
, andernfallsp
werden alle Zeilen gedruckt.Oder, wie Toby Speight betonte , mit GNU
sed
:Q
ist das gleiche wie,q
aber es druckt nicht den Musterraum.quelle
Q
stattq
für GNU sed oderd
vorherq
(portabel), um das-n
Flag und denp
Befehl nicht zu benötigen :sed '1{/PATTERN/!Q}' infile
odersed -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infile
.d
startet den Befehlszyklus neu Das fängt mich immer auf! : - |sed
der erstesed
Befehlsed: -e expression #1, char 10: extra characters after command
(wegen derp
), aber dieed
und die letztensed
Vorschläge funktionieren einwandfrei.sed -n '1{/PATTERN/!q};p'
Mit POSIX Tools Brust:
quelle
würde den Namen der nicht ausgeblendeten
txt
Dateien im aktuellen Verzeichnis drucken, dessen erste Zeile dem erweiterten regulären Ausdruckpattern
mit den unterstütztenawk
Implementierungen entsprichtnextfile
.Wenn Sie anstelle des Dateinamens den gesamten Dateiinhalt drucken möchten, haben Sie folgende Möglichkeiten:
Dies ist insofern effizient, als nur ein Befehl ausgeführt wird. Da es sich jedoch
awk
nicht um den effizientesten Befehl zum Speichern des Inhalts einer Datei handelt, können Sie bei großen Dateien möglicherweise bessere Leistungen erzielen, indem Sie Folgendes tun:Verwenden Sie
awk
diese Option nur , um die Liste der übereinstimmenden Dateien (durch 0 getrennt) zu drucken und sich daraufcat
zu verlassen , dass deren Inhalt ausgegeben wird.quelle
Wenn Sie ein Shell-Skript schreiben, könnten Sie so etwas wie
Oder in Perl:
quelle
close ARGV
ist mehr Redewendung als zuzuweisen$.
.Oldschool, übersetzen Sie einfach Ihren Satz in Standardbefehle:
Für das Lernen von Bash ist das ein guter Anfang. Wenn Sie nur eine schnelle Lösung benötigen, probieren Sie die sed-, awk- oder perl-Antworten aus. Beide sind nett, aber sie sind eigene Sprachen, die Sie lernen müssen (und wahrscheinlich wollen).
Es ist ein ziemlich einfaches Beispiel. Wenn Sie also mehr erfahren möchten, können Sie dasselbe auch in Ruby, PHP, JS (z. B. in NodeJS) oder einer anderen Sprache versuchen, die den Dateizugriff ermöglicht. Selbst C / C ++ oder Java sollte mit einer kleinen Aufgabe einfach zu verwalten sein.
quelle
if/else
anstelle von verwenden[ ] &&
.