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

how to remove part of the string if the condition exists

我有一个类似这样的文件:

   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

最后 2 行保持不变,因为它们在 * 之后没有 2 个冒号分隔符,所以这些值没有变化

我使用 sedgsub 删除了最后一个下划线后的所有内容,但不确定如何添加条件以在 *.[ 后没有 2 个冒号时免除该条件。 =14=]

这个有效:

$ sed -E 's/^([^:]*:[^:]*):[0-9][0-9]$//' file

[^:] 的意思是 'any character other than a :' 所以只有在有两个前导冒号的情况下才会在末尾进行删除。

这个awk也有效:

$ awk 'gsub(/:/,":")==2 {sub(/:[0-9][0-9]$/,"")} 1' file

在这种情况下,gsub returns 进行的替换次数。所以如果有两个冒号,就把结尾去掉。

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

$ grep -oP '^\w+\*\d\d:\d\d' file

perl同理:

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

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

cut -d: -f-2 ip.txt

类似的逻辑可以用awk完成,假设实现支持操纵NF

awk 'BEGIN{FS=OFS=":"} NF==3{NF=2} 1' ip.txt

这可能适合您 (GNU sed):

sed 's/:..//2' file

这将删除第二次出现的 : 后跟 2 个字符。

如果这太宽松,请使用:

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