Jak mieszać wzorce i zakresy liczbowe w sedzie (lub jakimkolwiek podobnym narzędziu - na przykład awk)? To, co chcę zrobić, to dopasować określone wiersze w pliku i usunąć następnych n wierszy przed kontynuowaniem, a chcę to zrobić jako część potoku.
106
+N
wzorzec jest rozszerzeniem GNU. Zmień pierwszyn
na aN
w drugim przykładzie, aby zawierał linię ze wzorem./pattern/,+5
definiuje zakres, który zaczyna się od wiersza zawierającego „wzorzec” (/pattern/
) i kończy 5 wierszy później (+5
). Ostatni znakd
to polecenie uruchamiane w każdym wierszu w tym zakresie, czyli „usuń”. W drugiej recepturze, zamiast dopasować zakres, dopasowuje tylko wiersz zawierający wzorzec (/pattern/
), a następnie wykonuje serię poleceń{n;N;N;N;N;d}
:, które w zasadzie drukuje następną linię (n
), a następnie odczytuje i ostatecznie odrzuca następne 4 wiersze (N;N;N;N;d
).sed -e '/pattern/{n;N;N;N;N;d;}' file.txt
something
wykonaj :,sed -E '/^something$/,$d'
gdzie-E
jest rozszerzonym wyrażeniem regularnym przenośności POSIX.Bez rozszerzeń GNU (np. Na macOS):
Aby usunąć 5 linii po wzorze (w tym linię ze wzorem)
Dodaj,
-i ''
aby edytować lokalnie.źródło
Proste
awk
rozwiązania:Załóżmy, że wyrażenie regularne używane do znajdowania pasujących wierszy jest przechowywane w zmiennej powłoki
$regex
i liczba wierszy do pominięcia$count
.Jeśli pasująca linia również powinna zostać pominięta (
$count + 1
linie są pomijane):Jeśli pasująca linia nie powinna być pomijana (
$count
linie po dopasowaniu są pomijane):Wyjaśnienie:
-v regex="$regex" -v count="$count"
definiujeawk
zmienne w oparciu o zmienne powłoki o tej samej nazwie.$0 ~ regex
pasuje do linii zainteresowania{ skip=count; next }
inicjalizuje licznik pominięć i przechodzi do następnej linii, skutecznie pomijając pasującą linię; w drugim rozwiązaniuprint
poprzednienext
zapewnia, że nie jest ono pomijane.--skip >= 0
zmniejsza liczbę pominięć i podejmuje działanie, jeśli jest (nadal)> = 0, co oznacza, że linia powinna zostać pominięta.{ next }
przechodzi do następnej linii, skutecznie pomijając bieżącą linię1
jest powszechnie używanym skrótem{ print }
; to znaczy, że bieżący wiersz jest po prostu drukowany1
jest równoważny{ print }
,1
jest interpretowany jako wzorzec boolowski, który z definicji zawsze przyjmuje wartość true, co oznacza, że skojarzona z nim akcja (blok) jest wykonywana bezwarunkowo. Ponieważ w tym przypadku nie ma skojarzonej akcji,awk
domyślnie drukowany jest wiersz.źródło
To może Ci pomóc:
źródło
pattern_number.txt
jest plikiem z dwiema kolumnami, zawierającym wzorzec do dopasowania w pierwszej kolumnie, aw drugiej liczbie linii do pominięcia. Pierwszesed
polecenie przekształca plik wsed
skrypt, który przeprowadza odpowiednie dopasowywanie i pomijanie; ten skrypt jest dostarczany za pośrednictwem-f
i stdin (-
) do drugiegosed
polecenia. Drugiesed
polecenie działa na przykładowym pliku wejściowym ad-hoc utworzonym z danych wyjściowych programu,seq 21
aby zademonstrować, że działa.Korzystanie z Perla
źródło
To rozwiązanie umożliwia przekazanie „n” jako parametru i odczytanie wzorców z pliku:
Plik o nazwie „-” oznacza stdin dla awk, więc jest odpowiedni dla twojego potoku
źródło