4

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

我可以像这样使用 cut 来做到这一点: echo "ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," | cut -d',' -f 2-

但有人告诉我 cut 比 sed 慢...

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

4

3 回答 3

3

以我的经验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,,,
于 2013-03-14T11:50:36.503 回答
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}

(假设这是一次性匹配,而不是迭代文件的内容。)

于 2013-03-14T13:05:51.753 回答
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}
于 2020-05-14T07:09:46.893 回答