Bash Shell – 第二次出现某个字符后返回子string

我需要返回一切后,我决定的分度,但仍然不完全知道如何使用sed。 我需要做的是:

$ echo "ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," \ | sed <some regexp> 

对于这个例子,返回值应该是(substring)第二个逗号之后的所有内容:

 123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,, 

我可以用这样的方法做到这一点: echo "ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," | cut -d',' -f 2 echo "ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," | cut -d',' -f 2

但我已经被告知剪切比sed慢…

有谁能拥有他们(并且想要……)的上师能给我几分钟的时间,并给我build议吗? 谢谢! 狮子座

根据我的经验, cut总是比sed快。

sed来做你想要的,你可以使用一个不匹配的组:

 echo 'ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' | sed -r 's/([^,]*,){2}//' 

这将删除前两个字段(如果字段本身不包含逗号),则删除非逗号字符[^,]后跟逗号两次{2}

输出:

 123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,, 

你也可以尝试在bash进行提取,而不会产生一个外部进程:

 $ [[ 'ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' =~ [^,]*,[^,]*,(.*) ]] $ echo "${BASH_REMATCH[@]}" 123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,, 

要么

 $ FOO='ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' $ echo ${FOO/+([^,]),+([^,]),} 

要么

 $ IFS=, read -a FOO <<< 'ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' $ echo ${FOO[@]:2} 

(假设这是一次性匹配,而不是迭代文件的内容)。