grep: 'X' girdi dosyası da çıktı


12

Kullandığım ubuntu 14.4ve çıktısını yönlendirmek girişiminde grepbir dosyaya komuta ama bu hatayı almaya devam:

grep: input file 'X' is also the output

Ben bu sorunu araştırdım ve sadece bir hata olduğunu öğrendim ubuntu 12.4ve hakkında herhangi bir açıklama yok, kimse bu sorunu anlamak için bana yardımcı olabilir mi?

Aşağıdaki komutu çalıştırıyorum:

grep -E -r -o -n r"%}(.*){%" > myfile

Eğer deniyorsanız grep pattern file > fileo zaman işe yaramaz. Grep için giriş ve çıkışla aynı dosyayı kullanamazsınız.
jimmij

komutumu ekliyorum! ipucu için teşekkürler, ama başka bir yolda bir dosya kullanmaya çalıştığınızda bunu yüklemez ve bunu yapamam!
Kasramvd

örneğin ../fi ile bunu albash: ../f.txt: Permission denied
Kasramvd

tam komutu göster, giriş dosyanız nedir veya kanal kullanıyor musunuz?
jimmij

1
Şimdi aslında tüm dizin yapısını özyinelemeli olarak açığa vurduğunuzu ve sonucu zaten bu yapıda bulunan dosyaya eklemek istediğinizi anlıyorum. Sorun şu ki, kabuk (bash, zsh, neyse) ilk olarak yeniden yönlendirmeler gerçekleştirir ve ancak daha sonra komutlara geri döner (bu örnekte grep). Bu grep, komutta grep pattern file > filezaten boş bir dosya gördüğünden, giriş olarak hiçbir şey olmadığı anlamına gelir . Ancak >>bunun yerine kullanırsanız >, dosya boş değildir, ancak grep, aynı satırın (desen) tekrar tekrar işlenmesine neden olabileceğinden, yine de hata atar.
jimmij

Yanıtlar:


9

İçin girdi ve çıktı ile aynı dosyayı kullanmak mümkün değildir grep. Aşağıdaki alternatifleri göz önünde bulundurabilirsiniz:

  • geçici dosya

    grep pattern file > tmp_file
    mv tmp_file file
    
  • sed

    sed -i -n '/pattern/p' file
  • tüm dosyayı değişkene koy (büyük dosyalar için parlak bir fikir değil)

    x=$(cat file); echo "$x" | grep pattern > file

1
sed daha taşınabilir olabilirsed -i '/pattern/!d' file
Costas

Ama OP istiyorsased -i -n 's/.*\(pattern\).*/\1/p' file
Costas

@Costas haklısın, soru düzenlendi ve ek bilgi eklendi, böylece sedsözdizimi de cilalanabilir .
jimmij

5

Komutunuzdaki --excludealanı şu şekilde kullanabilirsiniz grep:

grep  --exclude=myfile  -Eron  r"%}(.*){%"  >  myfile

2
myfileYalnızca dosyanın temel adı için geçerli olduğundan benzersiz olduğundan emin olun . Diğer dizinlerde aynı ada sahip dosyaları atlamak istemezsiniz.
Walf

1

Bash'de bir yol buldum: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

Önce komut <<<"..."çalıştırılacaktır.

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.