Je suppose que 'awk' est un outil pour le travail, même si je pense que 'sed' est plus simple pour cette opération particulière. La spécification est un peu vague. La version simple est:
- Trouvez la première ligne contenant un mot donné.
- Supprimez cette ligne et toutes les lignes suivantes.
Pour cela, j'utiliser sed:
sed '/word/,$d' file
La version plus complexe est:
- Trouver la première ligne contenant un mot donné.
- Supprimer le texte sur cette ligne à partir du mot.
- Supprimez toutes les lignes de texte suivantes.
j'utiliser probablement encore sed:
sed -n '1,/word/{s/word.*//;p}' file
Inverse la logique. Il n'imprime rien par défaut, mais pour les lignes 1 jusqu'à la première ligne contenant le mot, il fait un remplacement (qui ne fait rien jusqu'à la ligne contenant le mot), puis imprime.
Peut-il être fait dans 'awk'? Pas complètement trivial parce que 'awk' auto-splite les lignes d'entrée en mots, et parce que vous devez utiliser des fonctions pour faire des substitutions.
awk '/word/ { if (found == 0) {
# First line with word
sub("word.*", "")
print $0;
found = 1
}
}
{ if (found == 0) print $0; }' file
(Modifié: changement « supprimer » à « trouvé » depuis « supprimer » est un mot réservé dans « awk ».)
Dans tous ces exemples, la version tronquée du fichier d'entrée est écrit sur la sortie standard. Pour modifier le fichier in situ, vous devez soit utiliser Perl ou Python ou une langue similaire, soit capturer la sortie dans un fichier temporaire que vous copiez sur l'original une fois la commande terminée. (Si vous essayez vous traitez « fichier script » un fichier vide.)
Il existe différentes optimisations de sortie précoce qui pourraient être appliquées aux scripts sed et awk, tels que:
sed '/word/q' file
Et, si vous Supposons l'utilisation des versions GNU de awk ou sed, il existe diverses extensions non standard qui peuvent aider à la modification in-situ du fichier.
D'accord, probablement faire 1'd aussi dans encore,. – Stobor
sed -e «/\. */{S ///; q} fait la même chose, et précise que le mot une fois. (1 avait un commentaire précédent portage à faire la même chose, mais le match était mal ...), vous voulez probablement également spécifier \ pour éviter de se faire prendre sur les épées de quelqu'un. –
Stobor
@Stobor: Eh bien, bien sûr, nous entrons dans un territoire intéressant avec la définition des mots, ainsi que la définition de la version de la syntaxe regex « et » supports. La notation « \ » est excellent lorsqu'il est supporté; Traditionnellement, il est pas pris en charge, si 1 trouvent qu'il est pris en charge sur Solaris (un peu à ma grande surprise). –