我只想更新文件中的第一列,而不要更新第一次。下面是我当前用于更新第一次出现的代码。
修改首次出现的日期
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
答案 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