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)
, gdziefields
iseparators
to tablice.