Przetwarzanie danych wyjściowych wiersza polecenia rozdzielonych znakiem podkreślenia


2

Mam polecenie, które wygląda tak:

some_command Aktualny widok: username_token1_token2_token3_4_token4_2

Jak mogę przeanalizować część „token3_4_token4_2” z ciągu?


Co masz na myśli przez „parsowanie poza ciągiem znaków”? Czy chcesz usunąć token3_4_token4_2część, czy chcesz ją wyodrębnić?
speakr

Odpowiedzi:


1

Tutaj jest w Perlu:

perl -ne '$_ =~ s/([a-zA-Z0-9]+_){3}//; print $_;'

Na przykład:

% echo "username_token1_token2_token3_4_token4_2" | perl -ne '$_ =~ s/([a-zA-Z0-9]+_){3}//; print $_;'
token3_4_token4_2

Działa w następujący sposób:

Początkowo ciąg "username_token1_token2_token3_4_token4_2"jest wstawiany do $_zmiennej.

wyszukaj i zamień

s/....//

Dopasowuje ciąg_ (tj. Część .... powyżej)

([a-zA-Z0-9]+_)

Dopasowuje 3 z nich

{3}

zastępuje je niczym (tzn. usuwa)

//

wydrukuj co zostało z $ _

print $_


1

niektóre rozwiązania:

awk -F_ '{ print $5"_"$6"_"$7"_"$8 }'

.

awk '{ print gensub("^.*_([^_]+_[^_]+_[^_]+_[^_]+)$", "\\1", "g") }'

.

awk '{ if (match($0, "_([^_]+_[^_]+_[^_]+_[^_]+)$", a)) print a[1] }'

0

Po prostu używając bash:

alias some_command='echo "some_command Current view: username_token1_token2_token3_4_token4_2"'

read a b c < <(some_command)
token=$(IFS=_; set -- $c; shift 3; echo "$*")
echo $token

odbitki

token3_4_token4_2

Użyłem podstawienia procesu, aby przekierować dane wyjściowe polecenia do instrukcji read. Gdybym miał użyć potoku, odczyt miałby miejsce w podpowłoce, a zmienna $ c nie istniałaby w powłoce nadrzędnej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.