tr 명령을 제자리에서 사용할 수 있는 방법이 있습니까?

tr 명령을 제자리에서 사용할 수 있는 방법이 있습니까?

파일에서 영어가 아닌 영숫자 문자를 모두 제거하고 싶습니다.

tr -sc '[:alnum:][:punct:]' ' ' <file

gawk그리고 플래그가 sed있지만 -i매뉴얼 페이지에서 그런 것을 찾을 수 없습니다 tr.

이 작업을 내부에서 어떻게 수행할 수 있습니까? 즉, 출력을 입력 파일 자체에 저장합니까?

답변1

아니요. 이 기능을 갖춘 명령은 거의 없습니다. GNU awk( gawk)는 최근에야 이 기능을 추가했으며, 해당 기능이 있거나 -i이에 상응하는 명령의 경우에도 백그라운드에서 임시 파일을 만드는 것뿐입니다.

따라서 이를 수행하는 방법은 다음과 같습니다.

tr -sc '[:alnum:][:punct:]' ' ' <file >newfile && mv newfile file

이 기능이 자주 필요한 경우 작은 기능을 활성화할 수 있습니다.

tri(){
  tmpFile=$(mktemp)
  echo "$@"
  case $# in
    ## You've given tr options
    4)
      trOpts="$1"
      set1="$2"
      set2="$3"
      inputFile="$4"
      ;;
    ## No options, only set1 and set2 and the input file
    3)
      set1="$1"
      set2="$2"
      inputFile="$3"
     ;;
    ## Something wrong
    *)
      echo "Whaaaa?"
      exit 1
      ;;
  esac
  tr "$trOpts" "$set1" "$set2" < "$inputFile" > "$tmpFile" &&
    mv "$tmpFile" "$inputFile"
}

그런 다음 다음과 같이 실행할 수 있습니다.

tri -sc '[:alnum:][:punct:]' ' ' file

real 과 달리 tr입력( )을 리디렉션하는 대신 인수로 파일 이름이 필요하며 <file옵션은 위에 표시된 대로( like 대신 -s -c) 함께 지정됩니다.

답변2

tr명령은 읽은 만큼의 데이터를 쓰기 때문에 출력을 제자리에 쓰는 것이 안전합니다.

쉘 포함 ksh93:

tr -sc '\n[:alnum:][:punct:]' '[ *]' < file 1<>; file

(이것은 표준/POSIX 구문으로 변환 [ *]하고 비텍스트 출력 생성을 방지하기 위해 보존할 문자 목록에 개행을 추가합니다.)

ksh93 특정 연산자는 리디렉션된 명령이 성공적으로 완료되면 파일이 현재 위치에서 잘린다는 점을 제외하면 잘림 없는 1<>;표준 읽기+쓰기 연산자와 유사합니다 .1<>

관련 정보