Bash Shell - 在第二次出现某个字符后返回子字符串

时间:2013-03-14 11:44:06

标签: linux bash sed substring

我需要在我决定的分隔符之后返回所有内容,但仍然不完全知道如何使用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慢......

一些拥有他们(并且想要...... :)的大师可以给我几分钟的时间并给我建议吗? 谢谢! 利奥

3 个答案:

答案 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}