grep sınırlayıcıyı değiştirme


12

Herhangi bir şekilde grep kullanan sınırlayıcıyı değiştirebilir miyiz?

Bence, varsayılan olarak, grep \nsınırlayıcı olarak kullanır .


Bu SuperUser.com daha uygun olurdu gibi görünüyor
Mitch Dempsey

Man sayfasını okuyun, böyle bir seçenek olup olmadığına bakın (hayır, olduğuna inanmıyorum).
Cascabel

Zaten okumuştum. ve hayır, hayır seçeneği yoktur

@jhon: O zaman grep'i nasıl değiştireceğinizi sormayın, başka bir şeyle ne yapmak istediğinizi nasıl yapacağınızı sorun. Örneğin, perl ( $/) ve awk ( RS) içinde kayıt ayırıcısını belirtebilirsiniz . Veya böyle bir şey yapabilirsiniz echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Gerçek sorunun ne olduğuna bağlı olarak birçok cevap.
Cascabel

Yanıtlar:


2

Bu, sadece çıkış umurumda trsizin için işe yarayabilecek:

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;

aslında, bir değişken içinde depolanan böyle bir veri buch var: bir şey xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ yani, mümkün olup olmadığını tahmin ediyordum: echo $ my_var | grep "bir şey" bu işe yarıyor, ama istediğim gibi değil, grep veri demetini tek bir satır olarak alıyor, bu yüzden onu belirli bir karaktere değiştirmek istiyorum (burada '@')

Sonra böyle koymak deneyebilirsiniz:echo $my_var | tr @ '\n' | grep blahblah
che

Yaptım, ama, kabuk içeriği yürütmeye "çalışıyor" gibi görünüyor: S

2
$my varBeyaz boşlukları ve yeni satırları korumak için değişkeni belirtmeniz gerekir echo "$my_var" | ....
mrucci

1

agrepArizona Üniversitesi'nden sınırlayıcıyı ayarlamanızı sağlar. Grep'in yerine geçecek bir yedek değil; farklı bir algoritma kullanır (yaklaşık grep, hatalarla eşleşebilir) ve farklı desen sözdizimine sahiptir. Ama bu kullanışlı bir araç.

Ne yazık ki, lisanslama sorunları nedeniyle, denilen birden fazla benzer proje var agrepve hepsi uyumlu değil. Ancak tüm sürümlerin bir sınırlayıcı belirlemenize izin verdiğini düşünüyorum.


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) Bu sorunu çözebilirken, cevapların biraz daha açıklanmasını tercih ediyoruz. Örneğin, d="${1}"sadece söylemek yerine gerçek bir neden var d="$1"mı? (2) Uyarınızı genişletmeniz gerekir: Bu, birden fazla dosyayla kullanılıyorsa, dosya adlarından herhangi birinde `` '' varsa da bir sorununuz vardır. (3) (Nit pick) Gerçek bir “grep” değiştirme / emülatörü de sıfır dosya argümanıyla çalışır.
Scott

1

Grep'ten önce sıfır sınırlayıcıyı ('@') yeni satırla (\ n) değiştirin:

kedi dosyası | tr '\ 00' '\ n' | grep "arama dizesi"


0

Bu nasıl ? Herhangi bir kullanımı var mı?

grep dosyası "arama dizesi" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

'@' Ayarını ihtiyacınıza göre ayarlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.