grep zmienia separator


12

w jakikolwiek sposób możemy zmienić ogranicznik, który używa grep?

Myślę, że domyślnie grep używa \njako separatora.


Brzmi to tak, jakby lepiej pasowało na SuperUser.com
Mitch Dempsey

Przeczytaj stronę podręcznika, zobacz, czy jest taka opcja (nie, nie sądzę, żeby była).
Cascabel

Już to przeczytałem. i nie, nie ma opcji

@jhon: Więc nie pytaj, jak zmienić grep, pytaj, jak zrobić to, co chcesz zrobić z czymś innym. Na przykład możesz określić separator rekordów w perl ( $/) i awk ( RS). Lub możesz zrobić coś takiego echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Wiele odpowiedzi, w zależności od tego, jaki jest twój rzeczywisty problem.
Cascabel

Odpowiedzi:


2

Jeśli zależy Ci tylko na wynikach, trmoże Ci pomóc:

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;

właściwie mam dużo takich danych, przechowywanych w zmiennej: coś xxxxx rrrrr @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ więc zgadywałem, czy to możliwe: echo $ my_var | grep „coś” to działa, ale nie tak, jak chcę, grep bierze grupę danych w jednym wierszu, dlatego chcę zmienić to na konkretny znak (tutaj jest „@”)

Następnie możesz spróbować przedstawić to w następujący sposób:echo $my_var | tr @ '\n' | grep blahblah
che

Zrobiłem to, ale wygląda na to, że powłoka „próbuje” wykonać zawartość: S

2
Musisz zacytować zmienną, $my varaby zachować białe spacje i znaki nowej linii, tj echo "$my_var" | ....
mrucci

1

agrepz University of Arizona pozwala ustawić ogranicznik. Nie zastępuje grep; wykorzystuje inny algorytm (przybliżony grep, może dopasowywać się do błędów) i ma inną składnię wzorca. Ale to przydatne narzędzie.

Niestety, myślę, że z powodu problemów z licencjonowaniem nazwano wiele podobnych projektów agrepi nie wszystkie są kompatybilne. Myślę jednak, że wszystkie wersje pozwalają ustawić ogranicznik.


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) Chociaż może to rozwiązać problem, wolimy, aby odpowiedzi zawierały nieco więcej wyjaśnień. Na przykład, czy jest jakiś prawdziwy powód, aby powiedzieć d="${1}"zamiast po prostu d="$1"? (2) Musisz rozwinąć swoje ostrzeżenie: jeśli jest używane z wieloma plikami, masz również problem, jeśli którakolwiek z nazw plików zawiera `@ '. (3) (Nit pick) Prawdziwa zamiana / emulator „grep” również działałby przy zerowych argumentach pliku.
Scott

1

Zastąp znak zerowy („@”) znakiem nowej linii (\ n) przed grep:

plik kota | tr '\ 00' '\ n' | grep „ciąg wyszukiwania”


0

Jak to jest Jakieś zastosowanie?

plik grep "ciąg wyszukiwania" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Ustaw „@” zgodnie z potrzebami.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.