我有一些命令,其输出如下所示:
some_command 当前视图:username_token1_token2_token3_4_token4_2
我如何从字符串中解析出“token3_4_token4_2”部分?
答案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/....//
匹配字符串_(即上面....的一部分)
([a-zA-Z0-9]+_)
匹配其中 3 个
{3}
用空值替换它们(即删除)
//
打印 $_ 剩下的内容
print $_
答案2
sed 's/^[^:]*:[^_]*_[^_]*_[^_]*_//'
答案3
一些解决方案:
awk -F_ '{ print $5"_"$6"_"$7"_"$8 }'
。
awk '{ print gensub("^.*_([^_]+_[^_]+_[^_]+_[^_]+)$", "\\1", "g") }'
。
awk '{ if (match($0, "_([^_]+_[^_]+_[^_]+_[^_]+)$", a)) print a[1] }'
答案4
仅使用 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
我使用进程替换将命令的输出重定向到 read 语句。如果我使用管道,那么 read 将在子 shell 中发生,并且 $c 变量将不存在于父 shell 中。