我需要在我决定的分隔符之后返回所有内容,但仍然不完全知道如何使用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
但我被告知切割速度比sed慢......
一些拥有他们(并且想要...... :)的大师可以给我几分钟的时间并给我建议吗? 谢谢! 利奥
答案 0 :(得分:2)
根据我的经验,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,,,
答案 1 :(得分:0)
您也可以尝试在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}
(假设这是一次性匹配,而不是迭代文件的内容。)
答案 2 :(得分:0)
此方法是通过查找字符第二次出现的索引并使用bash子字符串来获得所需的结果
input="ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,"
index=$(($(echo $input| grep -aob '/' | grep -oE '[0-9]+' | awk 'NR==2') + 1))
result=${input:$index}