web-dev-qa-db-fra.com

Comment puis-je me débarrasser du séparateur de ligne "-" lors de l'utilisation de grep avec des lignes de contexte?

J'ai un fichier texte nommé compare.txt que je veux extraire la seule ligne qui suit chaque ligne qui contient le motif "nmse_gain_constant". La commande suivante me rapproche:

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant

Mais cela inclut un séparateur "-" entre chaque ligne de texte souhaité. Des idées simples pour se débarrasser des lignes "-"?

Je vous donnerais un exemple de texte ici, mais les caractères "-" sont interprétés à tort par ce message Web comme des caractères de contrôle et ce que vous verriez n'est pas correct.

59
Michael

Je fais ça:

 grep ... | grep -v -- "^--$"

Mais ça marche aussi!

grep --no-group-separator ...

Et il ne crache pas ce "-" ni même une ligne vierge.

83
Erik Aronesty

Il existe un paramètre non documenté de grep: "--group-separator", qui remplace le "-" par défaut. Vous pouvez le régler sur "" pour supprimer le double tiret. Cependant, vous obtenez toujours une ligne vide. J'ai eu le même problème et j'ai trouvé ce paramètre en lisant le code source de grep.

24
Shaohua Li

Eh bien, le commutateur A par défaut ajoutera ces caractères, donc ce n'est pas un mystère.

man grep États:

-A NUM

    Places  a  line  containing  a  group  separator  (--)   between
    contiguous  groups  of  matches.  With the -o or --only-matching
    option, this has no effect and a warning is given.

Mais vous pouvez utiliser un simple sed pour nettoyer le résultat:

yourgrep | sed '/^--$/d'
20
Eddie

Il n'est pas nécessaire de diriger vers autant de greps ou d'utiliser d'autres outils (par exemple, sed) si vous utilisez AWK:

awk '/nmse_gain_constant/{getline;print }' compare.txt
7
ghostdog74

Une solution sera:

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant  | grep -v "\-\-"
3
Amirshk