/ / Sed lub awk Znajdź ciąg znaków w ciągu ostatnich 100 znaków lub usuń linię - regex, bash, awk, sed

Sed lub awk Znajdź ciąg znaków w ciągu ostatnich 100 znaków linii lub usuń linię - regex, bash, awk, sed

pierwsze pytanie, więc mam nadzieję, że dobrze je sformułuję.

Zamierzam dopasować ciąg znaków, a mianowicie "lang": "en" w ciągu ostatnich 100 znaków linii, a jeśli nie ma dopasowania, usuń linię.

Próbowałem używać sed przez działanie

sed "/"lang":"en"/!d" file > output

Ale niestety wiele linii ma ten ciąg więcej niż jeden raz i zależy mi tylko na ostatecznym jego wystąpieniu.

Uczę się sed, ale nic nie wiemo awk i większość moich wyszukiwań wymyśliła "pierwsza / ostatnia instancja w pliku" zamiast "w wierszu", więc każda pomoc w nauce najlepszej metody to byłoby świetne. dzięki.

Odpowiedzi:

4 dla odpowiedzi № 1

Powinno to działać z dowolnym awk Posix:

awk "match(substr($0,length-99),/"lang":"en"/)" file

Możesz to zrobić za pomocą prostego wyszukiwania ciągów, zamiast wyrażenia regularnego, ale ciąg jest bardziej irytujący w pisaniu:

awk "index(substr($0,length-99),""lang":"en"")" file

Oba po prostu wyodrębniają 100 ostatnich znakówkażda linia, a jeśli wzór testowy znajduje się w podłańcuchu, wydrukuj linię (druk jest domyślną akcją, więc program składa się tylko z warunku).


1 dla odpowiedzi nr 2

Dla prostego rozwiązania opartego na regex,

grep -E ""lang":"en".{0,89}$" file

Odjąłem długość "lang":"en" od maksymalnej kwoty, zakładając, że masz na myśli ciąg znaków, który należy znaleźć w całości w ciągu ostatnich 100 znaków.

Wygląda na to, że próbujesz przetwarzać dane JSON, więc być może wymyślisz lepszą regułę opartą na strukturze i użyjesz jq zamiast.

jq "select(path["to"]["lang"] == "en")" file

znaleźć "en" w strukturze "path": { ... "to": { ..., "lang": "en" ...} } }. Będzie to również odporne na nowe linie w JSON, różnice w odstępach "lang": "en"itp.


0 dla odpowiedzi № 3
sed "/"lang":"en".{0,89}$/!d" file > output

Dodaj możliwe 89 innych znaków przed końcem w zaznaczeniu