我需要返回一切后,我决定的分度,但仍然不完全知道如何使用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}
(假设这是一次性匹配,而不是迭代文件的内容)。