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.