Jak używać wyrażenia regularnego jako separatora pól w awk?

Próbuję użyć wyrażenia regularnego jako separatora pól w awk. Z mojego czytania wydaje mi się, że jest to możliwe, ale Nie mogę uzyskać prawidłowej składni.

rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string 

Co o tym myślisz? Celem, jeśli nie jest to oczywiste, jest uzyskanie listy oprogramowania bez numeru wersji.

Odpowiedź

Zepsułeś cudzysłowy i składnię. Aby ustawić separator pól wejściowych, najłatwiej to zrobić za pomocą opcji -F w wierszu poleceń:

awk -F "[0-9]" "{ print $1 }" 

lub

awk -F "[[:digit:]]" "{ print $1 }" 

Spowoduje to użycie dowolnej cyfry jako separatora pól wejściowych, a następnie wyprowadzi pierwsze pole z każdego wiersza.

Wyrażenia [0-9] i [[:digit:]] nie są całkiem takie same, w zależności od ustawień regionalnych. Zobacz „ Różnica między [0-9], [[: digit:]] i \ d ”.

Można również ustawić FS w samym programie awk. Zwykle jest to wykonywane w bloku BEGIN, ponieważ jest to jednorazowa inicjalizacja:

awk "BEGIN { FS = "[0-9]" } { print $1 }" 

Zwróć uwagę, że pojedynczy cudzysłowy nie mogą być „t używane w pojedynczym cudzysłowie w powłoce i że awk łańcuchy zawsze używają podwójnych cudzysłowów.

Komentarze

  • Czy można uzyskać dostęp do FS i zobaczyć dopasowany ciąg?

Odpowiedź

+1 dla odpowiedzi Kusalanandy. Alternatywnie, zmienną FS można ustawić w bloku BEGIN:

awk "BEGIN {FS="[0-9]"} {print $1}" 

Zmiana FS w bloku akcji nie odniesie skutku do momentu odczytania następnej linii

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi 

Pozostałe błędy w pytaniu:

  • nie można „używać pojedynczych cudzysłowów w ciągu znaków w pojedynczym cudzysłowie
  • == jest operatorem porównania, = służy do przypisywania zmiennych

Komentarze

  • " Changi ng FS w bloku akcji wygrał ' nie zadziała do momentu odczytania następnej linii " I ' szukałem wszędzie tych informacji.
  • plus: czy ' nie można używać pojedynczych cudzysłowów dla wartości ciągu w awk, nawet jeśli przekazujesz je z poprawnie powłoka
  • Czy można uzyskać dostęp do FS i zobaczyć dopasowany ciąg?
  • FS jest zmienną, więc robisz coś podobnego dowolna inna zmienna (np. print FS). Myślę, że aby uzyskać części pasujące do FS, w POSIX awk nie można. W GNU awk można napisać n = split($0, fields, FS, separators), gdzie fields i separators to tablice.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *