我需要返回一个分隔符后,我决定,但仍然不完全知道如何使用SED的一切。 我需要做的是:
$ echo "ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," \
| sed <some regexp>
在这个例子中返回的应该是第二个逗号后(子)的一切:
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慢...
可一些大师谁拥有他们(和希望...... :))给我的他几分钟的时间和建议我好吗? 谢谢! 狮子座
根据我的经验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}
(假设这是用于一次性的匹配,而不是遍历一个文件的内容)。