[英]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.