У меня есть команда, вывод которой выглядит так:
some_command Текущее представление: username_token1_token2_token3_4_token4_2
Как я могу разобрать часть "token3_4_token4_2" из строки?
У меня есть команда, вывод которой выглядит так:
some_command Текущее представление: username_token1_token2_token3_4_token4_2
Как я могу разобрать часть "token3_4_token4_2" из строки?
некоторые решения:
awk -F_ '{ print $5"_"$6"_"$7"_"$8 }'
,
awk '{ print gensub("^.*_([^_]+_[^_]+_[^_]+_[^_]+)$", "\\1", "g") }'
,
awk '{ if (match($0, "_([^_]+_[^_]+_[^_]+_[^_]+)$", a)) print a[1] }'
sed 's/^[^:]*:[^_]*_[^_]*_[^_]*_//'
Вот это в 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/....//
([a-zA-Z0-9]+_)
{3}
//
print $_
Просто используя 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 не существовала бы в родительской оболочке.