mettre un caractère spécial ou vide si le motif n'est pas trouvé

J'ai le tableau d'informations suivant:

ko:K00624 ko:K20215 1.5.3.5 ko:K01106 2.3.41.5 

Je veux la sortie comme ceci:

 ko:K00624 ko:K20215 - ko:K01106 - 

J'ai utilisé la command suivante mais cela ne fonctionne pas. S'il vous plaît me suggérer

 cat filename | awk '{if($1!~"ko"); print "-") print }' | less 

Voici ma réponse sed , FWIW

 sed s/^[^ko].*/-/g filename 

Vous venez de replace chaque ligne qui ne commence pas par ko avec un - . (Je l'aurais ajouté comme commentaire mais je n'ai pas encore le représentant.)

Une version corrigée possible de votre command awk :

 awk '{if($1!~"ko") print "-"; else print }' filename 

bien qu'il puisse être plus vernaculaire de le faire comme

 awk '$0 !~ /^ko/ {$0 = "-"} {print}' filename 

ou (forme plus courte)

 awk '!/^ko/ {$0 = "-"} 1' filename 

Une autre alternative de GNU sed (en utilisant la command c plutôt que la command s ):

 sed '/^ko/!c-' filename 
 sed -e '/^ko/!s/.*/-/' input_file.dat 

ce qui signifie, pour toutes les lignes qui ne commencent pas par "ko", il suffit d'aller de l'avant et de replace la ligne complète par un tiret. Pour tout le rest, laissez-le tel quel et imprimez sans modification.

Ou….

  ~]$ echo -e "ko:K00624\nko:K20215\n 1.5.3.5\nko:K01106\n2.3.41.5" \ | while read line ; do if [[ $line =~ ko ]] ; then echo $line ; else echo "-" ; fi ; done ko:K00624 ko:K20215 - ko:K01106 - 
 perl -nE 'say /(^ko.*)/ ? $1 : "-"' input.txt