sed -i와 같이 파일에 "expand" 명령을 적용합니다.

sed -i와 같이 파일에 "expand" 명령을 적용합니다.

expand명령에는 다음과 같은 명령이 없습니다.

sed -i <file>

expand실제로 옵션이 있지만 -i이는

공백 뒤에만

같은 목적을 달성하는 다이나믹 듀오 조합이 sed있을까요 ?expand

답변1

GNU 유틸리티 Expand는 sed가 제공하는 '현재 위치' 업데이트를 제공하지 않습니다. 명령이 약간 길어질 수 있지만 동일한 결과를 재현하는 것은 매우 간단합니다.

손상 위험 없이 임의의 파일 시스템에서 파일을 동시에 구문 분석하고 업데이트하는 것은 불가능하며, 이러한 이유로 sed는 사용자로부터 파일을 추상화하더라도 실제로 이를 수행하지 않습니다. sed가 하는 일은 여러분이 직접 재현할 수 있는 것입니다. 작업의 출력을 임시 파일의 개체 파일에 저장한 다음 원본을 삭제하고 임시 이름을 원본으로 바꾸는 것입니다.

이를 수행하는 방법에는 여러 가지가 있습니다. 여기에 하나가 있습니다. orig.txt라는 파일은 '확장'되는 파일입니다.

tmp=`mktemp` && expand orig.txt > "$tmp" && mv "$tmp" orig.txt

확장하기 위해 파일 이름 이외의 인수를 사용하지 않는 경우 이름이 지정된 간단한 함수는 expand전체 임시 파일을 원래 파일 스왑으로 숨기고 sed동작을 재현할 수 있습니다. 이 구현은 경로/파일 이름의 단일 인수를 사용합니다.

expand() {
  [[ "$#" -ne "1" ]] && { echo "A single argument must be provided"; exit 1; }
  tmp=`mktemp` && expand "$1" > "$tmp" && mv "$tmp" "$1"
}

약간만 수정하면 expand인수를 지원하여 모든 기능을 다시 만들 수 있습니다. 객체 파일의 파일 이름을 알 수 있도록 마지막 인수를 파악하여 궁극적으로 expand. 마지막 인수는 로 참조됩니다 ${@ -1}.

expand() {
      [[ "$#" -lt "1" ]] && { echo "At least a file name argument must be provided"; exit 1; }
      # Here we capture the last argument which is the object file name
      fname="${@: -1}"
      # The upcoming call to expand passes on all arguments including the file name
      tmp=`mktemp` && expand "$@" > "$tmp" && mv "$tmp" "$fname"
    }

나는 이 코드를 테스트하지 않았으므로 내가 발견하지 못한 구문 오류가 있다면 사과드립니다.

이러한 기능 중 하나 또는 그 버전은 .bashrc쉽게 사용할 수 있도록 새 셸을 만들 때 제공되는 동등한 파일에 배치되어야 합니다.

파일이 '제자리'로 업데이트되는지 또는 업데이트가 stdout으로 전송되는지 여부를 지정할 수 있도록 하려면 이 함수 템플릿을 수정하여 추가 인수(에 전달되지 않음)를 기반으로 할 수 있습니다. 확장하지만 확장 호출 방법이 변경됨) 당신이 그것을 찾고 있는지 잘 모르겠지만, 당신이 찾고 있다면 지금 그것을 하는 데 필요한 모든 정보를 가지고 있다고 생각합니다.

또는 더 재미있게 보려면 GNU coreutils를 다운로드하세요.소스 코드그리고sed 소스 코드, sed가 이를 처리하는 방법을 확인하고 해당 코드를 새롭고 향상된 확장 버전으로 마이그레이션하세요. 해당 변경 사항을 관리자에게 다시 보내면 향후 모든 '확장' 사용자를 위해 이를 단순화할 수 있습니다.

관련 정보