繁体   English   中英

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

[英]sed to modify only first column in a file but not the first occurrence if it matches

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

修改日期的首次出现

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

使用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

对于-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

添加开头为(^)模式以匹配:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM