다른 명령을 "제자리"에 두는 명령이 있습니까?

다른 명령을 "제자리"에 두는 명령이 있습니까?

나는 종종 쉘 내부에서 파일을 "편집"하려고 시도하는 것을 발견합니다. words.txt그 문자가 포함된 모든 줄을 삭제하고 싶습니다.이자형. 그런 다음 다음을 실행합니다.

$ grep -v e words.txt > words-without-e.txt
$ mv words-without-e.txt words.txt

많은 사람들이 다음 명령을 실행할 때 왜 빈 파일이 남아 있는지 혼란스러워합니다(저는 파일이 없습니다).

$ grep -v e words.txt > words.txt
grep: words.txt: input file is also the output

--in-place일부 명령에는 다음 과 같은 내부 동작을 위한 특수 플래그가 있습니다.sed(1)) 이를 허용합니다. 사용할 수 있다sponge(1), 하지만 이 경우 파일 이름을 두 번 입력해야 하는데 마음에 들지 않습니다.

$ grep -v e words.txt | sponge words.txt

나는 매우 편리하다고 생각하는 함수를 정의했습니다.

function inplace { "${@:2}" < "$1" | sponge $1 }

이제 다음을 수행할 수 있습니다.

$ inplace words.txt grep -v e

나는 이것이 "스트림 처리", 즉 표준 입력을 받아 처리하고 표준 출력을 생성하는 명령으로 제한된다는 것을 알고 있습니다. 그러나 이것은 많은 명령에 해당됩니다.

제가 잘못된 곳을 찾고 있는 것일 수도 있지만, 특히 내부 편집에 대한 질문이 얼마나 자주 나오는지를 고려하면 아직 비슷한 정의를 우연히 발견하지 못했습니다.

  • 동일한 목적을 달성할 수 있는 일반 유틸리티가 있습니까?
  • 그런 함수를 정의한 적이 있나요? 당신의 정의는 무엇입니까? 그것을 뭐라고 부르나요?
  • 왜 이런 일이 더 자주 발생하지 않습니까? 아니면 제가 그냥 놓친 걸까요?

답변1

내가 아는 한, 모든 명령이 제대로 작동하도록 할 수 있는 범용 유틸리티는 없습니다.

일반적으로 사람들은 프로그래밍 방식으로 파일을 그 자리에서 편집하려는 경우 sed또는 perlwith -i매개변수를 사용합니다.

아마도 이것이 바로 이 주제가 자주 등장하지 않는 이유일 것입니다. 생각하는 것과는 달리, 파일을 편집할 수 있는 유틸리티가 있으면 그렇게 많이 필요하지 않습니다.

관련 정보