Bagaimana cara membuka file yang memiliki spasi dalam nama file dengan grep?

1

Saya ingin mencari frasa di dalam file .txt dan dengan teks Sublime buka semua file yang ditemukan. Saya menggunakan Git Bash untuk Windows dan setelah berbagai percobaan ini adalah apa yang saya miliki.bashrc

# Alias for opening Sublime Text
alias subl='C:/Program\ Files/Sublime\ Text\ 3/sublime_text.exe'

# Search inside files and open them in Sublime Text
lookfor() {
    subl $(grep -rIl "$1" /c/wamp64/www/notes --exclude-dir="\.git")
}

Saya menggunakan skrip seperti ini

lookfor lorem ipsum

Script hanya berfungsi untuk nama file yang tidak memiliki ruang, jika mereka melakukannya maka Sublime akan membuka file baru untuk masing-masing kata dalam nama file.

  1. Bagaimana skrip dapat dengan benar membuka semua file yang ditemukan grep?
  2. Bagaimana skrip berhenti mengeksekusi sendiri setelah membuka Sublime Text dan mengembalikan saya kontrol di bash? Saat ini saya harus menutup Sublime dan baru kemudian bash akan tersedia lagi

Saya telah mencoba berbagai kode lain untuk membuka file tanpa hasil

grep -rlZ "lorem ipsum" ./* | xargs -0 subl
xargs: subl: No such file or directory
Ivan Topić
sumber

Jawaban:

3

Pertanyaan ini bermuara pada fakta, bahwa parameter shell menggunakan spasi kosong sebagai pemisah, jadi hanya bersepeda melalui mereka itu sulit.

Cara terbaik IMHO adalah memperlakukan baris baru dan ruang kosong secara berbeda:

lookup() {
  while read f ; do
    test -f "$f" && subl "$f"
  done < <(grep -rIl "$1" /c/wamp64/www/notes --exclude-dir="\.git")
}

Jadi, Anda membaca hasil baris demi baris alih-alih token dengan token dan dengan demikian menyimpan token yang berbeda dari nama file yang sama.

EDIT

Untuk aplikasi, di mana membuka file dalam sekali jalan berbeda dengan membuka satu-per-satu ini dapat dengan mudah diadaptasi:

lookup() {
  CMD="subl"
  while read f ; do
    test -f "$f" && CMD="$CMD '$f'"
  done < <(grep -rIl "$1" /c/wamp64/www/notes --exclude-dir="\.git")
  eval "$CMD"
}
Eugen Rieck
sumber
Saya pikir ini berfungsi untuk kasus khusus ini karena Sublime hanya membuka file di jendela yang sama. Perintah lain mungkin tidak berfungsi seperti ini dan memerlukan daftar file sebagai satu set argumen.
slhck
Terima kasih, ini membuka semua file secara terpisah - pertama membuka satu file, kemudian setelah saya menutupnya dan Sublime, itu membuka kembali Sublime dengan file kedua dll, jadi satu-satunya downside adalah bahwa itu sedikit lebih lambat untuk alur kerja tetapi menyelesaikan pekerjaan
Ivan Topić
Lihat hasil edit saya untuk penggunaan ini
Eugen Rieck