2

У меня есть команда, вывод которой выглядит так:

some_command Текущее представление: username_token1_token2_token3_4_token4_2

Как я могу разобрать часть "token3_4_token4_2" из строки?

4 ответа4

1

некоторые решения:

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

,

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

,

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

Вот это в Perl:

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

Например:

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

Работает следующим образом:

Первоначально строка "username_token1_token2_token3_4_token4_2" помещается в переменную $_ .

поиск и замена

s/....//

Соответствует string_ (т.е. часть .... выше)

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

Матчи 3 из них

{3}

заменяет их ничем (т.е. удаляет)

//

распечатать то, что осталось от $ _

print $_
0

Просто используя 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

печать

token3_4_token4_2

Я использовал подстановку процесса, чтобы перенаправить вывод команды в оператор чтения. Если бы я использовал канал, тогда чтение произошло бы в подоболочке, а переменная $ c не существовала бы в родительской оболочке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .