sed仅修改文件中的第一列,如果匹配则不修改第一次出现

时间:2019-04-04 03:58:14

标签: regex sed

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

修改首次出现的日期

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”格式的第一列,而忽略它是否已经处于“ yyyy / 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

3 个答案:

答案 0 :(得分:1)

使用GNU sed:

$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

答案 1 :(得分:1)

使用-E的GNU或OSX / BSD启用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

答案 2 :(得分:0)

添加以(^)开头的模式以进行匹配:

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