grep changer le délimiteur


12

de toute façon, nous pouvons changer le délimiteur qui utilise grep?

Je pense que, par défaut, grep utilise \ncomme délimiteur.


Cela semble être mieux adapté sur SuperUser.com
Mitch Dempsey

Lisez la page de manuel, voyez s'il y a une telle option (non, je ne pense pas qu'il y en ait).
Cascabel

Je l'ai déjà lu. et non, il n'y a pas d'option

@jhon: Alors ne demandez pas comment changer grep, demandez comment faire ce que vous voulez faire avec autre chose. Par exemple, vous pouvez spécifier le séparateur d'enregistrement dans perl ( $/) et awk ( RS). Ou vous pourriez faire quelque chose comme ça echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Beaucoup de réponses, selon votre problème réel.
Cascabel

Réponses:


2

Si vous vous souciez de la sortie, cela trpourrait fonctionner pour vous:

che@nok ~ $ grep cpu /proc/cpuinfo | tr '\n' ';'
cpu family      : 6;cpu MHz             : 800.000;cpu cores     : 2;cpuid level : 10;cpu family : 6;cpu MHz : 800.000;cpu cores      : 2;cpuid level : 10;

en fait, j'ai un tas de données comme celle-ci, stockées dans une variable: quelque chose xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ donc, je devinais si c'était possible: echo $ my_var | grep "quelque chose" cela fonctionne, mais pas comme je le veux, grep prend le tas de données comme une seule ligne, c'est pourquoi je veux le changer en un caractère spécifique (voici '@')

Ensuite, vous pourriez essayer de le dire comme suit:echo $my_var | tr @ '\n' | grep blahblah
che

Je l'ai fait, mais il semble que le shell "essaie" d'exécuter le contenu: S

2
Vous devez citer la variable $my varpour conserver les espaces blancs et les retours à la ligne, c'est-à-dire echo "$my_var" | ....
mrucci

1

agrepde l'Université de l'Arizona vous permet de définir le délimiteur. Ce n'est pas un remplacement direct pour grep; il utilise un algorithme différent (grep approximatif, peut correspondre à des erreurs) et a une syntaxe de modèle différente. Mais c'est un outil pratique.

Malheureusement, je pense agrepqu'en raison de problèmes de licence, plusieurs projets similaires ont été appelés et ils ne sont pas tous compatibles. Mais je pense que toutes les versions vous permettent de définir un délimiteur.


1
case $# in
0|1|2)  cat >&2 <<EOF
    Usage: $0 delimiterstring pattern files....
    Behaves like grep -pdelimiterstring but on linux
    DOES NOT SUPPORT MOST ARGUMENTS
    unlike grep -p - leaves delimiterstring in output

    NO -p just the delimeterstring
    note: delimiterstring has to work in the sed command where the ${d} is
    if you are going to use @ in the delimeter string, then the @'s
    need to be replaced by someother character

EOF
    exit 0
;;
3)  mode=one ;;
*)  mode=many ;;
esac
d="${1}"
p="${2}"
shift 2
while [ $# -gt 1 ]
do
    sed "s@${d}@\x00@g" "${1}" | grep -z  "${p}" -  | (
        case $mode in 
        many) sed -e "s@\x00@${d}@g"  -e "s@^@${1}: @" ;;
        *)    sed -e "s@\x00@${d}@g"  ;;
        esac
    )
    shift
done

1
(1) Bien que cela puisse résoudre le problème, nous préférons que les réponses aient un peu plus d'explications. Par exemple, y a-t-il une vraie raison de dire d="${1}"au lieu de juste d="$1"? (2) Vous devez étendre votre avertissement: s'il est utilisé avec plusieurs fichiers, vous avez également un problème si l'un des noms de fichiers contient «@». (3) (Nit pick) Un véritable remplacement / émulateur «grep» fonctionnerait également avec zéro argument de fichier.
Scott

1

Remplacez le délimiteur zéro ('@') par une nouvelle ligne (\ n) avant grep:

fichier chat | tr '\ 00' '\ n' | grep "chaîne de recherche"


0

Comment c'est ? Une utilisation?

fichier grep "chaîne de recherche" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Réglez «@» sur ce qui convient à vos besoins.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.