grep : 입력 파일 'X'도 출력


12

을 사용 ubuntu 14.4하고 grep명령 출력을 파일 로 리디렉션하려고 시도 하지만이 오류가 계속 발생합니다.

grep: input file 'X' is also the output

이 문제를 검색하여 버그가 있음을 발견했으며 ubuntu 12.4이에 대한 설명이 없습니다.

다음 명령을 실행합니다.

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

시도하면 grep pattern file > file작동하지 않습니다. grep의 입력 및 출력과 동일한 파일을 사용할 수 없습니다.
jimmij

나는 내 명령을 추가! 힌트 주셔서 감사합니다,하지만 다른 경로에서 파일을 사용하려고하면 파일을 선언하지 않으며 그렇게 할 수 없습니다!
Kasramvd

예를 들어 ../fi로 이것을 얻으십시오bash: ../f.txt: Permission denied
Kasramvd

전체 명령 표시, 입력 파일이 무엇입니까, 아니면 파이프를 사용하고 있습니까?
jimmij

1
이제는 전체 디렉토리 구조를 재귀 적으로 그 리핑 하고이 구조에 이미 존재하는 파일에 결과를 추가하려고합니다. 문제는 쉘 (bash, zsh 등)이 먼저 리디렉션을 수행 한 다음 명령으로 돌아갑니다 (이 예제에서는 grep). 그것은 것을 의미 grep명령에 grep pattern file > file이미 빈 파일을보고, 그래서 입력으로 아무런 관계가 없습니다. 그러나 >>대신 대신 사용 >하면 파일이 비어 있지 않지만 grep은 같은 줄 (패턴)을 반복해서 반복하여 처리 할 수 ​​있으므로 오류를 발생시킵니다.
jimmij

답변:


9

에 대한 입력 및 출력과 동일한 파일을 사용할 수 없습니다 grep. 다음 대안을 고려할 수 있습니다.

  • 임시 파일

    grep pattern file > tmp_file
    mv tmp_file file
    
  • sed

    sed -i -n '/pattern/p' file
  • 전체 파일을 변수에 넣습니다 (큰 파일은 밝지 않습니다)

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

1
sed 는 더 휴대가 가능합니다sed -i '/pattern/!d' file
Costas

그러나 OP가 원하는 경우sed -i -n 's/.*\(pattern\).*/\1/p' file
Costas

@ 코스타 당신이 맞아, 질문이 편집되고 추가 정보가 추가되어 sed구문을 연마 할 수 있습니다.
jimmij

5

명령 에서 --exclude필드를 다음 grep과 같이 사용할 수 있습니다 .

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

2
myfile파일의 기본 이름에만 적용되므로 고유 해야 합니다. 다른 디렉토리에서 같은 이름의 파일을 건너 뛰고 싶지 않습니다.
Walf

1

나는 bash에서 길을 찾았다. cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

의 명령 <<<"..."이 먼저 실행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.