grep motif de sortie et de non-appariement partie de la ligne
Je sais qu'il est possible d'inverser grep sortie avec la -v
drapeau. Est-il un moyen de sortie seulement la non-correspondance de la partie de la correspondance de la ligne? Je demande parce que je voudrais utiliser le code de retour de la commande grep (sed de ne pas en avoir). Voici en gros ce que j'ai:
tags=$(grep "^$PAT" >/dev/null 2>&1)
[ "$?" -eq 0 ] && echo $tags
vérifier
Comme l'inverse de ce que
Prentice oui quelque chose comme ça. Pour ma part, je n'ai besoin que le reste de la ligne.
grep -q
Comme l'inverse de ce que
-o
?Prentice oui quelque chose comme ça. Pour ma part, je n'ai besoin que le reste de la ligne.
OriginalL'auteur Dennis Hodapp | 2011-06-20
Vous devez vous connecter pour publier un commentaire.
Comment sur l'utilisation d'une combinaison de
grep
,sed
et$PIPESTATUS
pour obtenir le bon de sortie de statut?Les membres de la
$PIPESTATUS
tableau détenir le statut de sortie de chaque commande exécutée dans un tuyau.$PIPESTATUS[0]
détient le statut de sortie de la première commande dans le tuyau,$PIPESTATUS[1]
le statut de sortie de la deuxième commande, et ainsi de suite.OriginalL'auteur Fredrik Pihl
Vous pouvez utiliser
sed
:Le seul problème est qu'il va retourner un code de sortie 0 tant que le modèle est bon, même si le modèle ne peut pas être trouvé.
Explication
La
-n
paramètre indiquesed
pas imprimer toutes les lignes. Sed est par défaut pour imprimer toutes les lignes du fichier. Regardons chaque partie de lased
programme entre barres obliques. Supposons que le programme est/1/2/3/4/5
:/$PAT/
: Ce dit de regarder pour toutes les lignes qui correspond au modèle$PAT
pour exécuter votre substitution de commande. Sinon,sed
fonctionnera sur toutes les lignes, même si il n'y a pas de substitution./s/
: Cela indique que vous allez faire une substitution/$PAT/
: C'est le modèle vous sera remplaçant. C'est$PAT
. Donc, vous êtes à la recherche pour les lignes qui contiennent$PAT
et puis vous allez à remplacer le modèle pour quelque chose.//
: C'est ce que vous êtes en remplaçant par$PAT
. Il est nul. Donc, vous êtes à la suppression de$PAT
de la ligne./p
: Cette dernièrep
dit à l'impression de la ligne.Ainsi:
sed
de ne pas imprimer les lignes du fichier tel qu'il les traite.$PAT
.s
de commande (substitution) pour supprimer le motif.Hodapp: Sed ne vous donne pas un code de sortie différent de zéro, car il fonctionne même si ce n'était pas de modifier quoi que ce soit. Vous pouvez simplement faire un
if [ -z $tags ]
pour tester si$tag
a été défini. Ou, vous pourriez pipegrep
parsed
et puis obtenir le statut de sortie degrep
via le$PIPESTATUS
variable d'environnement puisqu'il est possible que grep va trouver quelque chose, mais il ne sera pas n'importe quelle balise ensemble. Je pourrais donner un peu plus d'infos si je savais ce dont on a besoin. Dans votre post original,grep
n'a pas de nom de fichier sur la ligne de commande. À l'entrée pourgrep
prises de sortie standard (STDOUT)?Ma question n'était pas très bon, et j'ai copié le mal. J'ai oublié d'ajouter le fichier d'entrée qui était un fichier avec plusieurs lignes. Votre réponse (avec commentaire) est aussi exactement ce que j'avais à l'esprit. Je ne peux pas le prix de la réponse à 2 personnes.
Ce serait sympa si vous pourriez nous expliquer ce que la forme générale de ce qui précède la syntaxe de sed est. c'est à dire, ce que l'enfer ne
/$pat/s/$pat//p
moyenne dans les sed-parler? Comment l'application de cette syntaxe résoudre OP question?Demandez et vous recevrez. Voir explication ci-dessus.
OriginalL'auteur David W.
Votre $tags n'en aura jamais, car vous l'envoyer vers /dev/null. En dehors de ce petit problème, il n'y a pas d'entrée à grep.
succès d'un code de retour est 0.
...voici 1 prendre à votre "problème":
... exactement la même chose?:
Il me semble que vous avez confondu les notions de base. Qu'essayez-vous de le faire de toute façon?
OriginalL'auteur Ярослав Рахматуллин