解析下划线分隔的命令行输出

解析下划线分隔的命令行输出

我有一些命令,其输出如下所示:

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 中。

相关内容