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?

Artem
źródło
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 $_
slm
źródło
1
sed 's/^[^:]*:[^_]*_[^_]*_[^_]*_//'
Nicole Hamilton
źródło
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] }'
sparkie
źródło
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.

Glenn Jackman
źródło