Piszę skrypt, chcę sprawdzić, czy pierwszy wiersz pliku pasuje do określonego wzorca, a jeśli tak, to wydrukuj plik. Jak mogę to osiągnąć?
Jak mogę sprawdzić wzór? Czy istnieje sposób na sprawdzenie wzoru i na podstawie danych wyjściowych zrób coś…
EDYCJA: Proszę spojrzeć na to pytanie: /programming/5536018/how-to-get-match-regex-pattern-using-awk-from-file
Chcę czegoś takiego, ale żaden z nich nie działał dla mnie. Zasadniczo chcę sprawdzić, czy pierwszy wiersz pasuje do wzorca wyrażenia regularnego, czy nie i na podstawie tego wydrukować wiersze pliku.
Odpowiedzi:
Możesz to zrobić za pomocą
ed
:sztuczka polega na tym, aby spróbować zastąpić się
PATTERN
on-1st
line.ed
wyskoczy z błędu, jeśli nie może znaleźć określonego wzorca, więc,p
(wydrukuj cały plik) zostanie wykonany, tylko jeśli1s/PATTERN/&/
się powiedzie.Lub z
sed
:to
q
uits jeśli pierwsza linia nie (!
) odpowiadająPATTERN
, inaczejp
rints wszystkie linie.Lub, jak wskazał Toby Speight , z GNU
sed
:Q
jest taki sam jak,q
ale nie drukuje przestrzeni wzoru.źródło
Q
zamiastq
GNU sed lubd
wcześniejq
(przenośny), aby nie wymagać odpowiednio-n
flagi ip
polecenia:sed '1{/PATTERN/!Q}' infile
lubsed -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infile
, odpowiednio.d
ponownie uruchamia cykl poleceń, który zawsze mnie łapie! : - |sed
pierwszesed
polecenie narzekased: -e expression #1, char 10: extra characters after command
(z powodup
), aleed
ostatniesed
sugestie działają dobrze.sed -n '1{/PATTERN/!q};p'
Z skrzynią z narzędziami POSIX:
źródło
by wydrukować nazwę non-ukryte
txt
pliki w bieżącym katalogu, którego pierwsza linia pasuje rozszerzonego wyrażenia regularnegopattern
z tychawk
inplementations że wsparcienextfile
.Jeśli zamiast wydrukować nazwę pliku, chcesz wydrukować całą zawartość pliku, możesz:
Jest to wydajne, ponieważ uruchamia tylko jedno polecenie, ale
awk
nie jest najskuteczniejszym poleceniem zrzutu zawartości pliku, w przypadku dużych plików można uzyskać lepszą wydajność, wykonując coś takiego:Oznacza to, że należy
awk
go używać tylko do drukowania listy pasujących plików (rozdzielonych cyfrą 0) i polegać nacat
zrzutach ich zawartości.źródło
Jeśli piszesz skrypt powłoki, możesz coś takiego
Lub w Perlu:
źródło
close ARGV
to bardziej idiom niż przypisywanie$.
.Oldschool, po prostu przetłumacz swoje zdanie na standardowe polecenia:
Nauka bash to dobry początek. Jeśli potrzebujesz tylko szybkiego rozwiązania, wypróbuj odpowiedzi sed-, awk- lub perl. Oba są ładne, ale są to własne języki, których potrzebujesz (i prawdopodobnie chcesz) się uczyć.
Jest to dość prosty przykład, więc jeśli chcesz dowiedzieć się więcej, możesz spróbować tego samego w Ruby, PHP, Js (np. W Nodejs) lub w innym języku, który pozwala na dostęp do plików. Nawet C / C ++ lub Java powinny być łatwe do zarządzania przy niewielkim zadaniu.
źródło
if/else
zamiast[ ] &&
.