Bash 文件中的替换数字

Bash 文件中的替换数字,bash,sed,scripting,Bash,Sed,Scripting,我有一个包含时间戳的行的文件,下面是一个示例: Event IND200G5200Z5 20151104-030035 20151104-030000+0300 C 5280 10 20151104-025958+0300 OCP 5281 7 Event IND207X3200Z5 20151104-065436 20151104-030003+0300 UOF

我有一个包含时间戳的行的文件,下面是一个示例:

Event   IND200G5200Z5        20151104-030035        20151104-030000+0300    C      5280    10      20151104-025958+0300    OCP      5281    7
Event   IND207X3200Z5        20151104-065436        20151104-030003+0300    UOF      5280    9       20151104-025958+0300    OCP      5281    7
我想删除第三列中的最后两位数字以获得:

Event   IND200G5200Z5        20151104-0300        20151104-030000+0300    C      5280    10      20151104-025958+0300    OCP      5281    7
Event   IND207X3200Z5        20151104-0654        20151104-030003+0300    UOF      5280    9       20151104-025958+0300    OCP      5281    7
有很多行具有不同的时间戳,我只需要删除最后2行。我不想使用awk,我需要将更改保存在同一个文件中。我试过这样的方法:

sed -i 's/d{8}[-]d{6}/d{8}[-]d{4}/'
sed -i 's/\-[0-9][0-9][0-9]/[0-9][0-9][0-9][0-9]/'
不幸的是,这不起作用。

这可能适合您(GNU-sed):

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

从整体上看,这将删除第三组非空格字符中的最后两个非空格字符。

这正是我需要的,除了命令末尾的“g”标志。谢谢是 啊不需要“g”使用awk或不使用awk与将更改保存在同一文件中有什么关系?即使您使用
sed-i
(一个不兼容POSIX、不可移植的选项),它仍然会写入一个临时文件并在原始文件上重命名,因此,这并不是说你在减少文件系统IO而不是自己这样做。如果我误解了什么,请纠正我,但使用awk时,我需要将输出重定向到另一个文件(awk“expression”$file1>file2),而使用sed则会变得更简单。如果你安装了更多工具:
awk“expression”$file1“|海绵“$file1”
。而且
sed-i
版本是不可移植的——POSIX sed根本不支持它,GNU sed和OSX sed的变体的用法彼此不兼容。
sed -ri 's/(\S+)\S\S/\1/3' file