如果条件存在,如何删除部分字符串
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 个冒号分隔符,所以这些值没有变化
我使用 sed
和 gsub
删除了最后一个下划线后的所有内容,但不确定如何添加条件以在 *.[ 后没有 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
我有一个类似这样的文件:
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 个冒号分隔符,所以这些值没有变化
我使用 sed
和 gsub
删除了最后一个下划线后的所有内容,但不确定如何添加条件以在 *.[ 后没有 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