SED取代表达"在"一个正则表达式

时间:2014-05-11 19:13:26

标签: regex bash date awk sed

我必须更改以下列格式编写的CSV文件列(日期):

YYYY-MM-DD

我希望它是

YYYY.MM.DD

我可以写一系列2 sed 规则管道一个到另一个,如:

sed 's/-/./' file.csv | sed 's/-/./' 

但这不干净。我的问题是:有没有办法在sed中分配变量并告诉它YYYY-MM-DD应该被解析为year=YYYY ; month=MM ; day=DD然后告诉它

write $year.$month.$day

或类似的东西?也许用awk?

4 个答案:

答案 0 :(得分:2)

您可以使用群组直接通过反向引用访问年,月和日:

sed 's#\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)#\1.\2.\3#g'

答案 1 :(得分:0)

您所做的相当于提供“全局”替换标志:

sed 's/-/./g' file.csv

sed没有变量,但确实有编号组:

sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\1.\2.\3/g' file.csv

或者,如果您的sed没有-r

sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1.\2.\3/g' file.csv

答案 2 :(得分:0)

您也可以尝试这个sed命令,

sed 's/\([0-9]\{4\}\)\-\([0-9]\{2\}\)\-\([0-9]\{2\}\)/\1.\2.\3/g' file

示例:

$ (echo '2056-05-15'; echo '2086-12-15'; echo 'foo-bar-go') | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1.\2.\3/g'
2056.05.15
2086.12.15
foo-bar-go

答案 3 :(得分:0)

以下是使用awk的替代解决方案:

awk 'BEGIN { FS=OFS="," } { gsub("-", ".", $1); print }' file.csv
  • BEGIN { FS=OFS="," }告诉awk,(变量FS,[输入]字段分隔符)将输入行分成字段,并使用{ {1}} 输出 修改输入行(变量,时,输出字段分隔符)。
  • OFS用字段 1 中的gsub("-", ".", $1)替换所有-个实例
    • 假设数据位于 1st 字段.;如果字段索引不同,请相应地替换$1中的1
  • $1只输出修改后的输入行,以换行符结尾。