grep: il file di input 'X' è anche l'output


12

Uso ubuntu 14.4e tento di reindirizzare l'output del grepcomando su un file, ma continuo a ricevere questo errore:

grep: input file 'X' is also the output

Ho cercato questo problema e ho appena scoperto che si trattava di un bug ubuntu 12.4e non esiste alcuna descrizione, qualcuno può aiutarmi a capire questo problema?

Eseguo il seguente comando:

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

Se stai provando, grep pattern file > fileallora non funziona. Non è possibile utilizzare lo stesso file di input e output per grep.
Jimmij,

aggiungo il mio comando! grazie per il suggerimento, ma quando provo ad usare un file in un altro percorso non lo predicano e non posso farlo!
Kasramvd,

per esempio con ../fi ottieni questobash: ../f.txt: Permission denied
Kasramvd il

mostra il comando completo, qual è il tuo file di input o stai usando la pipe?
Jimmij,

1
Ora capisco che in realtà ricorri in modo ricorsivo all'intera struttura di directory e vuoi aggiungere il risultato al file che già esiste in questa struttura. Il problema è che la shell (bash, zsh, qualunque cosa) prima esegue i reindirizzamenti e solo successivamente torna ai comandi (grep in questo esempio). Significa che grepal comando grep pattern file > filevede file già vuoto, quindi non ha nulla come input. Tuttavia, se si utilizza >>invece di >allora il file non è vuoto, ma grep genera comunque errori in quanto potrebbe portare a un'elaborazione ricorsiva della stessa riga (modello) più e più volte.
Jimmij,

Risposte:


9

Non è possibile utilizzare lo stesso file di input e output per grep. Puoi considerare le seguenti alternative:

  • file temporaneo

    grep pattern file > tmp_file
    mv tmp_file file
    
  • sed

    sed -i -n '/pattern/p' file
  • mettere l'intero file nella variabile (idea non brillante per file di grandi dimensioni)

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

1
sed può essere più portatilesed -i '/pattern/!d' file
Costas,

Ma nel caso in cui OP volessesed -i -n 's/.*\(pattern\).*/\1/p' file
Costas il

@Coste hai ragione, la domanda è stata modificata e sono state aggiunte ulteriori informazioni in modo da poter lucidare anche la sedsintassi.
Jimmij,

5

Puoi usare il --excludecampo nel tuo grepcomando in questo modo:

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

2
Assicurati che myfilesia univoco in quanto si applica solo al nome di base del file. Non si desidera saltare i file con lo stesso nome in altre directory.
Walf

1

Ho trovato un modo in bash: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

Il comando in <<<"..."verrà eseguito per primo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.