繁体   English   中英

使用sed替换直到第一次出现分隔符

[英]Replace till first occurrence of delimiter using sed

我正在尝试编写一个sed命令来替换字符串,直到仅第一次出现定界符。 例如,我在文件中有以下几行,其中“〜”是定界符:

ab c1~10/20/2010 00:00:00 ~1234~10.02~530.55
ab c2~10/10/2010T00:00Z:~12346~11.03~531
abc3~10/10/2010 00:00:00 00-000~122~12~532.44
abc4~10/11/2010~110~13~533

我想将所有日期(第二列)替换为“ 2010-10-10T00:00:00Z”这种格式。 如您所见,日期可以采用不同的格式,“ MM / dd / yyyy”之后的内容对我来说无关紧要,我想忽略它,而将其替换为“ T00:00:00Z”。 我已经写了以下命令:

SEPAR="\([ \/._-]\)\{1\}";
sed -i "s/\(0[1-9]\|1[012]\)$SEPAR\([123][0]\|[012][1-9]\|3[1]\)$SEPAR\(\(10\|20\)[0-9][0-9]\).*~/\5\-\1\-\3T00:00:00Z~/g" $file_name;

但是它将替换所有内容直到最后一列,例如,它将生成以下输出(请注意缺少两列):

ab c1~2010-10-20T00:00:00Z~530.55
ab c2~2010-10-10T00:00:00Z~531
abc3~2010-10-10T00:00:00Z~532.44
abc4~2010-10-11T00:00:00Z~533

我的预期输出是:

ab c1~2010-10-20T00:00:00Z~1234~10.02~530.55
ab c2~2010-10-10T00:00:00Z~12346~11.03~531
abc3~2010-10-10T00:00:00Z~122~12~532.44
abc4~2010-10-11T00:00:00Z~110~13~533

请帮助我写最后一部分“。*〜”,它将替换所有内容。

您可以为此使用awk

awk 'BEGIN{FS=OFS="~"} {
   sub(/[T ].*/, "", $2)
   split($2, a, /\//)
   $2 = a[3] "-" a[1] "-" a[2] "T00:00:00Z"
} 1' file

ab c1~2010-10-20T00:00:00Z~1234~10.02~530.55
ab c2~2010-10-10T00:00:00Z~12346~11.03~531
abc3~2010-10-10T00:00:00Z~122~12~532.44
abc4~2010-10-11T00:00:00Z~110~13~533

暂无
暂无

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

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