0
votes

Gardez les 3 premiers caractères de chaque mot contenant un personnage

J'ai un gros fichier texte avec des lignes telles que: xxx pré>

Ce dont j'ai besoin est de garder les trois premiers caractères de toutes les colonnes contenant un côlon, c'est-à-dire p>

sed 's/\b:[^ ]//g' file.txt | sed 's/\b:[^ ]//g'


2 commentaires

Pourquoi n'utilisez-vous pas Awk pour cela?


Très ouvert à Awk, aussi! Venait d'essayer de s'améliorer avec SED est tout.


5 Réponses :


2
votes

en utilisant awk code>. Imprimez seulement 3 premiers caractères de n'importe quel champ contenant du côlon, imprimez le reste tel quel.

awk '{ for (i=1;i<=NF;i++) if ($i ~/:/) $i=substr($i,1,3) } 1' file |column -t
  • substr () code> est l'un des Fonctions de chaîne GNU AWK . P> li>

  • 1 code> à la fin de l'instruction est équivalent à l'action {imprimé} code> Toute la ligne. P> li> ul>


    En ce qui concerne le format de sortie, si l'entrée est séparée et que vous souhaitez conserver les onglets, vous pouvez exécuter: p> xxx pré>

    ou une autre idée est à la jolie-impression avec colonne -t code> (ne pas insérer réel \ t code> mais le nombre approprié d'espaces entre champs) p> xxx pré>


6 commentaires

Agréable! Cela marche. Y a-t-il un moyen pour cela de ne pas remplacer mes onglets avec des espaces?


@ Noam42 Si votre entrée contient des onglets, veuillez mettre à jour votre question pour indiquer et indiquer où ils sont. Le code de l'échantillon que vous avez publié uniquement des panneaux d'ébauches, pas des onglets, de sorte que votre question ne semble pas que vous n'ayez pas d'onglets dans votre entrée.


@Ed Morton C'est bon, j'ai mis à jour avec une solution simple sur la façon de garder des onglets. Code formaté dans de sorte que des espaces, mais évidemment NOAM signifiait un fichier séparé. Je viens de supprimer le commentaire ici.


@Thatanasisp Ce n'est pas seulement vous qui a besoin de l'info que l'entrée contient des onglets, par exemple. Voir Thriplees Répondre et j'ai commencé uniquement de manipuler des blancs jusqu'à ce que j'ai eu un coup d'œil sur le commentaire de Naom42 ici. C'est une information importante qui manque de la question.


@Ed Morton c'est vrai, j'ai mis à jour ma réponse, merci.


Quand j'ai collé ma ligne de saisie du terminal dans la question, elle n'a pas maintenu les onglets et je ne pouvais pas comprendre comment les ajouter, donc j'ai eu recours à un certain nombre d'espaces (j'aurais dû mentionner "des onglets ", Désolé pour cela).



2
votes

Si, comme dans votre exemple, le côlon ne fait pas partie de la chaîne qui doit être préservée, essayez xxx

Les espaces littéraux dans les classes de caractères peuvent avoir besoin d'être augmentés avec des onglets et éventuellement d'autres caractères d'espace.

(la regex pourrait être plus jolie si votre sed prend en charge la regex étendue avec -e ou -r ou une telle option non standard; mais ce meupeur laid devrait être portable le plus n'importe où.)


3 commentaires

Je doute d'utiliser le ^ dans une subexpression en tant qu'alchor est portable. Et probablement il y a une faute de frappe dans votre SED expression. Je pense que cela aurait dû être s / \ (\ (^ \ | \) [^:] [^:] [^:] \): [^] * / \ 1 / g ou < Code> S / \ (\ (^ \ | \) [^:] [^:] [^:] \) [^:] *: [^] * / \ 1 / g


Merci; Typo corrigé. Je n'ai pas rencontré un sed qui n'autorise pas ^ à l'intérieur d'un groupe, bien que je suppose que cela pourrait être refoulé dans deux cas distincts (où sur / y le second nécessite / g ).


Il n'y a pas de SED qui n'autorise pas ^ comme ancrage "Démarrer de la chaîne", que ce soit à l'intérieur d'un groupe de capture ou non. Il faut évidemment être au début d'un groupe de capture pouvant correspondre au début de la chaîne d'entrée comme vous l'avez.



2
votes

Utilisation d'un SED qui a un -E code> doit activer les ER (par exemple GNU ou BSD / OSX SED):

$ sed 's/\([^[:space:]]\{3\}\):[^[:space:]]\{1,\}/\1/g' file
01    81118   9164.47    0/0   0/0  0/1


1 commentaires

Très propre SED: Cependant, et l'hypothèse que nous ne savons jamais rien de correctement sur l'entrée, nous pourrions supposer que si un onglet est le FS désigné, un espace de n'importe quel formulaire pourrait se produire dans un champ avec un colon. Donc ce qui précède échouerait. Mais encore une fois, cela est sous l'hypothèse que nous ne savons rien et nous devons hyper-généraliser le problème.



1
votes

Utilisation de gnu SED avec des extensions d'expression régulières, une doublure peut être la suivante: xxx

\ s correspond à des caractères non-espaces (une extension GNU).


0 commentaires

1
votes

Ceci pourrait fonctionner pour vous (GNU SED):

sed -E 's/\S*:/\n&/g;s/\n(\S{3})\S*/\1/g;s/\n//g' file


0 commentaires