Próbuję wydrukować dopasowaną linię i czwartą linię z dopasowanej linii (linia zawierająca szukane wyrażenie).
Korzystałem z następującego kodu:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
Ale to tylko drukuje dopasowaną linię.
Drukuje tylko czwartą linię.
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
Muszę wydrukować tylko dopasowaną linię i tylko czwartą linię.
shell-script
debal
źródło
źródło
egrep "pattern" -A4
grep -A 4 "pattern" file | sed -n '4p'
robi dokładnie to, co chcesz, chyba że ja cię nieporozumienie</td>
nie było czwartym wierszemOdpowiedzi:
W awk zrobiłbyś to w następujący sposób
lub
Wyjaśnienie
Pierwsze rozwiązanie wyszukuje wszystkie pasujące linie
pattern
. Po znalezieniu dopasowania zapisuje numer rekordu (NR
) w tablicynr
. Przechowuje również 4. rekord zNR
tej samej tablicy. Odbywa się to przeznr[NR+4]
. Każdy rekord (NR
) jest następnie sprawdzany, aby sprawdzić, czy jest obecny wnr
tablicy, a jeśli tak, to rekord jest drukowany.Drugie rozwiązanie działa zasadniczo w ten sam sposób, z wyjątkiem sytuacji, gdy napotka
pattern
drukowaną linię, a następnie zapisze 4. rekord przed nią w tablicynr
, a następnie przejdzie do następnego rekordu. Następnie, gdyawk
napotka ten czwarty rekord,NR in nr
blok zostanie wykonany i wydrukuje ten rekord +4 po nim.Przykład
Poniżej znajduje się plik danych przykładem
sample.txt
.Korzystanie z pierwszego rozwiązania:
Korzystanie z drugiego rozwiązania:
źródło
awk
skrótów, czy mógłbyś dodać krótkie wyjaśnienie (rzeczy takie jak druk sugerowany w awk i że tablice są skojarzone itp.)?Po prostu dodałem usunięcie odpowiednich linii przed drukowaniem
{ 3,5d ; p }
.źródło
sed: -e expression #1, char 18: unknown option to
s''Możesz wypróbować
-A
opcjęgrep
, która określa, ile wierszy po dopasowanej linii powinno zostać wydrukowanych. Połącz to zsed
, a otrzymasz wymagane linie.grep -A 4 pattern input.txt | sed -e '2,4d'
Używając
sed
, usuwamy z drugiej linii do czwartej.źródło
pattern
w pliku.Oto sposób w Perlu, który może poradzić sobie z dowolną liczbą pasujących linii:
W Perlu. zmienna specjalna
$.
to bieżący numer linii. Za każdym razem, gdy znajduję pasującą liniępattern
, drukuję ją i zapisuję jej numer jako$c
. Następnie drukuję ponownie, gdy bieżący numer linii jest o 4 większy niż poprzednio wydrukowany.źródło
Zasadniczo dokonujesz wyszukiwania i zastępowania. Możesz dodać po prostu znalezisko do tego samego polecenia i wydrukuje je oba :)
źródło