파일에서 영어가 아닌 영숫자 문자를 모두 제거하고 싶습니다.
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<>