grep Ändern des Trennzeichens


12

Wie können wir das Trennzeichen ändern, das grep verwendet?

Ich denke, standardmäßig verwendet grep \nals Trennzeichen.


Das klingt so, als wäre es besser für SuperUser.com geeignet
Mitch Dempsey

Lesen Sie die Manpage, um zu sehen, ob es eine solche Option gibt (nein, ich glaube nicht, dass es eine gibt).
Cascabel

Ich habe es schon gelesen und nein, es gibt keine Option

@jhon: Dann frag nicht, wie man grep ändert, sondern wie man das macht, was man mit etwas anderem machen will. Beispielsweise können Sie das Datensatztrennzeichen in perl ( $/) und awk ( RS) angeben . Oder du könntest so etwas tun echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Viele, viele Antworten, je nachdem, was Ihr eigentliches Problem ist.
Cascabel

Antworten:


2

Wenn Sie sich nur um die Ausgabe kümmern, trkönnte dies für Sie funktionieren:

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;

Eigentlich habe ich eine Menge solcher Daten, die in einer Variablen gespeichert sind: etwas xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ also habe ich geraten, ob es möglich ist: echo $ my_var | grep "etwas" das funktioniert, aber nicht wie ich will, grep nimmt die Datenmenge als einzelne Zeile, deshalb möchte ich sie in ein bestimmtes Zeichen ändern (hier ist '@')

Dann könnten Sie versuchen, es so echo $my_var | tr @ '\n' | grep blahblah
Che

Ich habe es getan, aber es scheint, dass die Shell "versucht", den Inhalt auszuführen: S

2
Sie müssen die Variable $my varin Anführungszeichen setzen, um Leerzeichen und Zeilenumbrüche beizubehalten echo "$my_var" | ....
Mrucci

1

agrepvon der University of Arizona können Sie das Trennzeichen festlegen. Es ist kein Ersatz für grep. Es verwendet einen anderen Algorithmus (ungefähres Grep, kann mit Fehlern übereinstimmen) und hat eine andere Mustersyntax. Aber es ist ein praktisches Werkzeug.

Leider denke ich, dass aufgrund von Lizenzproblemen mehrere ähnliche Projekte aufgerufen agrepwurden und nicht alle kompatibel sind. Aber ich denke, in allen Versionen können Sie ein Trennzeichen festlegen.


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) Obwohl dies das Problem lösen kann, bevorzugen wir Antworten, um etwas mehr Erklärungen zu erhalten. Gibt es zum Beispiel einen wirklichen Grund zu sagen, d="${1}"anstatt nur d="$1"? (2) Sie müssen Ihre Warnung erweitern: Wenn dies mit mehreren Dateien verwendet wird, haben Sie auch ein Problem, wenn einer der Dateinamen "@" enthält. (3) (Nit pick) Ein echter "grep" -Ersatz / Emulator würde auch mit Null-Dateiargumenten funktionieren.
Scott

1

Ersetzen Sie das Nulltrennzeichen ('@') durch eine neue Zeile (\ n) vor grep:

Katzendatei | tr '\ 00' '\ n' | grep "Suchzeichenfolge"


0

Wie ist das ? Irgendeine Verwendung?

grep-Datei "Suchzeichenfolge" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Stellen Sie '@' auf das ein, was Ihren Anforderungen entspricht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.