grep mengubah pembatas

12

bagaimana kita bisa mengubah pembatas yang menggunakan grep?

Saya pikir, secara default, grep menggunakan \nsebagai pembatas.

studiohack
sumber
Sepertinya ini akan lebih cocok di SuperUser.com
Mitch Dempsey
Baca halaman manual, lihat apakah ada opsi seperti itu (tidak, saya tidak percaya ada).
Cascabel
Saya sudah membacanya. dan tidak, tidak ada pilihan
@ jhon: Kalau begitu jangan bertanya bagaimana mengubah grep, tanyakan bagaimana melakukan apa yang ingin Anda lakukan dengan sesuatu yang lain. Misalnya, Anda dapat menentukan pemisah rekaman dalam perl ( $/) dan awk ( RS). Atau Anda bisa melakukan sesuatu seperti echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Banyak jawaban, tergantung pada apa masalah Anda yang sebenarnya.
Cascabel

Jawaban:

2

Kalau Anda peduli dengan output, trmungkin bekerja untuk Anda:

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;
che
sumber
sebenarnya, saya punya data buch seperti ini, disimpan di dalam variabel: sesuatu xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ jadi, saya menduga jika itu mungkin: echo $ my_var | grep "sesuatu" ini berfungsi, tetapi tidak seperti yang saya inginkan, grep mengambil banyak data sebagai satu baris, itu sebabnya saya ingin mengubahnya ke karakter tertentu (di sini adalah '@')
Maka Anda mungkin mencoba meletakkannya seperti ini:echo $my_var | tr @ '\n' | grep blahblah
che
Saya telah melakukannya, tetapi, tampaknya shell itu "mencoba" mengeksekusi konten: S
2
Anda harus mengutip variabel $my varuntuk mempertahankan spasi putih dan baris baru, yaitu echo "$my_var" | ....
mrucci
1

agrepdari University of Arizona memungkinkan Anda untuk mengatur pembatas. Ini bukan pengganti drop-in untuk grep; menggunakan algoritma yang berbeda (perkiraan grep, dapat mencocokkan kesalahan) dan memiliki sintaksis pola yang berbeda. Tapi ini alat yang berguna.

Sayangnya, saya pikir karena masalah perizinan, ada beberapa proyek serupa yang disebut agrep, dan tidak semuanya kompatibel. Tapi saya pikir semua versi memungkinkan Anda untuk menetapkan pembatas.

Norman Ramsey
sumber
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
Kurt
sumber
1
(1) Meskipun ini dapat menyelesaikan masalah, kami lebih suka jawaban memiliki sedikit penjelasan. Misalnya, apakah ada alasan nyata untuk mengatakan, d="${1}"bukan hanya d="$1"? (2) Anda perlu memperluas peringatan Anda: Jika ini digunakan dengan banyak file, Anda juga memiliki masalah jika salah satu nama file mengandung `@ '. (3) (Nit pick) Pengganti / emulator "grep" yang sebenarnya juga akan berfungsi dengan argumen nol file.
Scott
1

Ganti pembatas nol ('@') dengan baris baru (\ n) sebelum grep:

file kucing | tr '\ 00' '\ n' | grep "search-string"

Franz Meyer
sumber
0

Bagaimana dengan ini ? Ada gunanya?

grep file "search-string" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Tetapkan '@' untuk apa pun yang sesuai dengan kebutuhan Anda.

pengguna42723
sumber