grep: file input 'X' juga merupakan output

12

Saya menggunakan ubuntu 14.4, dan berusaha untuk mengarahkan output dari grepperintah ke file, tetapi saya terus mendapatkan kesalahan ini:

grep: input file 'X' is also the output

Saya telah mencari masalah ini dan baru mengetahui bahwa itu adalah bug ubuntu 12.4dan tidak ada penjelasan tentang, ada yang bisa membantu saya untuk mencari tahu masalah ini?

Saya menjalankan perintah berikut:

grep -E -r -o -n r"%}(.*){%" > myfile
Kasramvd
sumber
Jika Anda mencoba grep pattern file > filemaka itu tidak berhasil. Anda tidak dapat menggunakan file yang sama dengan input dan output untuk grep.
jimmij
saya menambahkan perintah saya! terima kasih atas petunjuk, tetapi ketika saya mencoba untuk menggunakan file di jalur lain tidak predikat dan saya tidak bisa melakukannya!
Kasramvd
misalnya dengan ../fi dapatkan inibash: ../f.txt: Permission denied
Kasramvd
perlihatkan perintah penuh, apa file input Anda, atau Anda menggunakan pipa?
jimmij
1
Sekarang saya mengerti bahwa Anda benar-benar memahami secara rekursif seluruh struktur direktori dan ingin menambahkan hasilnya ke file yang sudah ada dalam struktur ini. Masalahnya adalah shell (bash, zsh, apa pun) pertama kali melakukan pengalihan dan baru kemudian kembali ke perintah (grep dalam contoh ini). Ini berarti bahwa grepdalam perintah grep pattern file > filemelihat file sudah kosong, sehingga tidak memiliki apa pun sebagai input. Namun jika Anda menggunakan >>alih-alih >maka file tersebut tidak kosong, tetapi grep melempar kesalahan karena hal itu dapat menyebabkan pemrosesan berulang pada garis (pola) yang sama berulang-ulang.
jimmij

Jawaban:

9

Tidak mungkin menggunakan file yang sama dengan input dan output untuk grep. Anda dapat mempertimbangkan alternatif berikut:

  • file sementara

    grep pattern file > tmp_file
    mv tmp_file file
  • sed

    sed -i -n '/pattern/p' file
  • letakkan seluruh file dalam variabel (bukan ide cemerlang untuk file besar)

    x=$(cat file); echo "$x" | grep pattern > file
jimmij
sumber
1
sed bisa lebih portabelsed -i '/pattern/!d' file
Costas
Tetapi dalam kasus OP inginsed -i -n 's/.*\(pattern\).*/\1/p' file
Costas
@Costas Anda benar, pertanyaannya telah diedit dan info tambahan ditambahkan sehingga orang dapat memoles sedsintaksis juga.
jimmij
5

Anda dapat menggunakan --excludebidang dalam grepperintah Anda seperti:

grep  --exclude=myfile  -Eron  r"%}(.*){%"  >  myfile
AaronDanielson
sumber
2
Pastikan myfileunik karena hanya berlaku untuk nama file file. Anda tidak ingin melewatkan file dengan nama yang sama di direktori lain.
Walf
1

Saya menemukan jalan di bash: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

Perintah masuk <<<"..."akan dieksekusi terlebih dahulu.

osexp2003
sumber