Awk 如果条件存在,如何删除字符串的一部分

Awk 如果条件存在,如何删除字符串的一部分,awk,sed,gsub,Awk,Sed,Gsub,我有一个类似的文件: A*01:03:05 B1*02:06:08 F2*03:01:06 R5*02:01 S1*02:08 仅当有2个冒号分隔符时,才删除最后2个数字和冒号。因此,它将是: A*01:03 B1*02:06 F2*03:01 R5*02:01 S1*02:08 最后两行保持不变,因为它们在*之后没有两个冒号分隔符,因此不会对这些值进行更改 我使用sed和gsub删除最后一个下划线后的所有内容,但不确定如何添加条件

我有一个类似的文件:

   A*01:03:05
   B1*02:06:08
   F2*03:01:06
   R5*02:01
   S1*02:08
仅当有2个冒号分隔符时,才删除最后2个数字和冒号。因此,它将是:

   A*01:03
   B1*02:06
   F2*03:01
   R5*02:01
   S1*02:08
最后两行保持不变,因为它们在*之后没有两个冒号分隔符,因此不会对这些值进行更改

我使用
sed
gsub
删除最后一个下划线后的所有内容,但不确定如何添加条件以免除条件,因为在*

后没有2个冒号。这是有效的:

$ sed -E 's/^([^:]*:[^:]*):[0-9][0-9]$/\1/' file
[^:::][/code>表示“除a以外的任何字符:”,因此只有在有两个前导冒号的情况下,它才在末尾进行删除

awk
也适用:

$ awk 'gsub(/:/,":")==2 {sub(/:[0-9][0-9]$/,"")} 1' file
在这种情况下,
gsub
返回替换的次数。因此,如果有两个冒号,请删除结尾

您还可以使用GNU grep(带PCRE)仅匹配您要查找的模板:

$ grep -oP '^\w+\*\d\d:\d\d' file
perl
相同方式:

$ perl -lnE 'say "$1" if /(^\w+\*\d\d:\d\d)/' file

使用
cut
,您可以将
设置为分隔符,并仅打印前两个字段

cut-d:-f-2ip.txt
假设实现支持操作
NF

awk'BEGIN{FS=OFS=“:”}NF==3{NF=2}1'ip.txt
这可能适合您(GNU-sed):

这将删除第二个出现的
,后跟2个字符

如果这太宽松,请使用:

sed -E 's/^([^:]*:[^:]*):[0-9]{2}/\1/' file

请在您的问题中添加您的努力,这是非常鼓励的,谢谢。offtopic:
*:[^::]*
部分在桌面上以斜体显示browser@Sundeep当前位置我也是,但我认为这是一个降价问题,不是吗?我没有对代码进行格式化…是的,对不起,这并不意味着这是你方的问题。。在发表评论之前,我单击了“编辑”以查看是否可以发现任何问题,但在这种情况下,预览显示效果良好。。
sed -E 's/^([^:]*:[^:]*):[0-9]{2}/\1/' file