bash外壳 - 某些字符的第二次出现后返回子(Bash Shell - Return substr

2019-07-21 15:00发布

我需要返回一个分隔符后,我决定,但仍然不完全知道如何使用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慢...

可一些大师谁拥有他们(和希望...... :))给我的他几分钟的时间和建议我好吗? 谢谢! 狮子座

Answer 1:

根据我的经验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,,,


Answer 2:

您也可以尝试做在提取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}

(假设这是用于一次性的匹配,而不是遍历一个文件的内容)。



文章来源: Bash Shell - Return substring after second occurrence of certain character