Regex sed仅修改文件中的第一列,但不修改匹配的第一个引用

Regex sed仅修改文件中的第一列,但不修改匹配的第一个引用,regex,sed,Regex,Sed,我只想更新文件中的第一列,但不更新第一次出现的列。下面是我当前用于更新第一个事件的代码 修改日期的第一次出现的步骤 sed 's/\(....\)-\(..\)-\(..\)/\2\/\3\/\1/' 我面临着一些问题,比如有时日期的格式是正确的,在第一列,所以上面的代码修改了第三列或第四列中的日期,因为它是第一次出现。我不想要 以下是我正在做的事情: 2018-09-14^Aaaa^Aq^ATEST^Abc^2018-09-14^A1^2018-09-14 sed 's/\(....\)-

我只想更新文件中的第一列,但不更新第一次出现的列。下面是我当前用于更新第一个事件的代码

修改日期的第一次出现的步骤

sed 's/\(....\)-\(..\)-\(..\)/\2\/\3\/\1/'
我面临着一些问题,比如有时日期的格式是正确的,在第一列,所以上面的代码修改了第三列或第四列中的日期,因为它是第一次出现。我不想要

以下是我正在做的事情:

2018-09-14^Aaaa^Aq^ATEST^Abc^2018-09-14^A1^2018-09-14

sed 's/\(....\)-\(..\)-\(..\)/\2\/\3\/\1/' 

2018/14/09^Aaaa^Aq^ATEST^Abc^2018-09-14^A1^2018-09-14
我的文件中有些行的格式正确,有些则不正确。因此,如果文件中的第一列与“yyyy/mm/dd”格式不匹配,我只想修改它,如果它已经是“yyy/mm/dd”格式,则忽略它

输出我想要的

$cat test.csv
2018/14/09^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
2018-09-14^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
To
$ cat output_test.csv
2018/14/09^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
2018/14/09^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14
使用GNU时:

$cat test.csv |sed -E 's/^(\w+)-(\w\w)-(\w\w)/\1\/\3\/\2/'
然后进行真正的编辑:

$ sed -i -E 's/^(\w+)-(\w\w)-(\w\w)/\1\/\3\/\2/' test.csv >output_test.csv
添加以(^)开头的模式以匹配:

sed 's/^\(....\)-\(..\)-\(..\)/\1\/\3\/\2/' file

使用GNU或OSX/BSD为
-E
启用ERE:

$ sed -E 's:^([^-]+)-([^-]+)-([^^]+):\1/\3/\2:' test.csv
2018/14/09^Aaa^Aa^ATEST^Abc^2018/14/09^A1^2018-09-14
2018/14/09^Aaa^Aa^ATEST^Abc^2018-09-14^A1^2018-09-14

2018/14/09
是否采用了正确的yyyy/mm/dd格式?不必担心yyyy/mm/dd或yyyy/dd/mm。如果匹配,只在第一列中更改。