grep: o arquivo de entrada 'X' também é a saída

12

Eu uso ubuntu 14.4e tento redirecionar a saída do grepcomando para um arquivo, mas continuo recebendo este erro:

grep: input file 'X' is also the output

Eu procurei por esse problema e descobri que havia um bug ubuntu 12.4e não há descrição. Alguém pode me ajudar a descobrir esse problema?

Eu executo o seguinte comando:

grep -E -r -o -n r"%}(.*){%" > myfile
Kasramvd
fonte
Se você está tentando grep pattern file > file, não funciona. Você não pode usar o mesmo arquivo que entrada e saída para grep.
jimmij
eu adiciono meu comando! obrigado pela dica, mas quando eu tento usar um arquivo em outro caminho, o não predicado e eu não posso fazer isso!
Kasramvd 25/10
por exemplo, com ../fi, pegue isto #bash: ../f.txt: Permission denied
Kasramvd
mostre o comando completo, qual é o seu arquivo de entrada ou você está usando o pipe?
jimmij
1
Agora eu entendo que você está realmente ganhando recursivamente toda a estrutura de diretórios e deseja anexar o resultado ao arquivo que já existe nessa estrutura. O problema é que o shell (bash, zsh, qualquer que seja) primeiro executa redirecionamentos e só depois volta aos comandos (grep neste exemplo). Isso significa que grepno comando grep pattern file > filejá vê o arquivo vazio, então não tem nada como entrada. No entanto, se você usar em >>vez disso >, o arquivo não estará vazio, mas o grep lançará um erro de qualquer maneira, pois pode levar ao processamento recursivo da mesma linha (padrão) repetidas vezes.
jimmij

Respostas:

9

Não é possível usar o mesmo arquivo como entrada e saída para grep. Você pode considerar as seguintes alternativas:

  • Arquivo temporário

    grep pattern file > tmp_file
    mv tmp_file file
  • sed

    sed -i -n '/pattern/p' file
  • coloque o arquivo inteiro na variável (idéia não brilhante para arquivos grandes)

    x=$(cat file); echo "$x" | grep pattern > file
jimmij
fonte
1
sed pode ser mais portátilsed -i '/pattern/!d' file
Costas
Mas, no caso OP quersed -i -n 's/.*\(pattern\).*/\1/p' file
Costas
@ Costas, você está certo, a pergunta foi editada e foram adicionadas informações adicionais para que você possa polir a sedsintaxe também.
jimmij
5

Você pode usar o --excludecampo em seu grepcomando da seguinte maneira:

grep  --exclude=myfile  -Eron  r"%}(.*){%"  >  myfile
AaronDanielson
fonte
2
Verifique se myfileé exclusivo, pois se aplica apenas ao nome da base do arquivo. Você não deseja pular arquivos com o mesmo nome em outros diretórios.
Walf
1

Eu encontrei uma maneira no bash: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

O comando in <<<"..."será executado primeiro.

osexp2003
fonte