나는 배우고 awk
있는데 파일에 수정 사항을 저장 sed
하는 -i
옵션을 사용하는 것과 유사하게 파일에 변경 사항을 쓰는 옵션이 있는지 알고 싶습니다 .
리디렉션을 사용하여 변경 사항을 작성할 수 있음을 이해합니다. 그러나 awk
그렇게 할 수 있는 옵션 이 있습니까?
나는 배우고 awk
있는데 파일에 수정 사항을 저장 sed
하는 -i
옵션을 사용하는 것과 유사하게 파일에 변경 사항을 쓰는 옵션이 있는지 알고 싶습니다 .
리디렉션을 사용하여 변경 사항을 작성할 수 있음을 이해합니다. 그러나 awk
그렇게 할 수 있는 옵션 이 있습니까?
답변:
최신 GNU Awk ( 4.1.0 릴리스 이후 )에는 "inplace"파일 편집 옵션이 있습니다 .
[...] 새로운 기능을 사용하여 빌드 된 "inplace"확장을 사용하여 GNU "
sed -i
"기능 을 시뮬레이션 할 수 있습니다 . [...]
사용법 예 :
$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3
백업을 유지하려면
$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
> { print }' file1 file2 file3
inplace
실제로 iiSeymour의 답변gawk
에 따라 포함 된 라이브러리 이므로 로 포함 될 수있는 것입니다 . inplace
includefile
GNU awk 4.1.0 이상이 없다면 ...
sed의 -i
옵션 과 같은 옵션이 없으므로 대신 다음을 수행하십시오.
$ awk '{print $0}' file > tmp && mv tmp file
참고 :는 -i
마술이 아니며 임시 파일을 생성하여 sed
처리합니다.
GNU awk 4.1.0부터 ...
GNU awk
이 기능은 버전 4.1.0 (2013 년 10 월 5 일 릴리스) 에서 추가되었습니다 . -i
릴리스 된 노트에 설명 된대로 옵션을 제공하는 것만 큼 간단하지 않습니다 .
xgawk의 새로운 -i 옵션은 awk 라이브러리 파일을로드하는 데 사용됩니다. 옵션이 아닌 첫 번째 인수가 스크립트로 취급된다는 점에서 -f와 다릅니다.
inplace.awk
다음과 같이 번들 포함 파일 을 사용 하여 확장을 올바르게 호출해야합니다.
$ cat file
123 abc
456 def
789 hij
$ gawk -i inplace '{print $1}' file
$ cat file
123
456
789
변수 INPLACE_SUFFIX
는 백업 파일의 확장자를 지정하는 데 사용할 수 있습니다.
$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file
$ cat file
123
456
789
$ cat file.bak
123 abc
456 def
789 hij
나는이 기능이 추가되었습니다 행복하지만 전원이 언어의 간결함에서 오는와 같이 나에게, 구현은 매우 awkish하지 않습니다 -i inplace
너무 오래 8 자입니다 IMO .
공식 단어에 대한 매뉴얼 링크 입니다.
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
?
awk '{print $0}' file | sponge file
사용 sponge
에서 moreutils
.
대안은 다음을 사용하는 것입니다 sponge
.
awk '{print $0}' your_file | sponge your_file
당신은 대체 어디 '{print $0}'
당신의 awk 스크립트에 의해 your_file
파일의 이름으로 당신은 장소에서 편집 할.
sponge
파일에 저장하기 전에 입력을 완전히 흡수합니다.
sponge
의 일부입니다 moreutils
. 따라서 대부분의 시스템에는 기본적으로 존재하지 않습니다. 그러나 최소한 sponge
그 자체는 충분히 휴대 가능하며 거의 모든 곳에서 실행할 수있는 것처럼 보입니다 .
tee
기반 솔루션과 비교 하여이 솔루션의 단점은 sponge
쓰기 전에 RAM으로 모든 것을 읽으므로 큰 파일에서 정지한다는 것입니다.
다음은 작동하지 않습니다
echo $(awk '{awk code}' file) > file
이 작동합니다
echo "$(awk '{awk code}' file)" > file
임시 파일을 만들지 않고 awk 전용 솔루션을 원하고 version! = (gawk 4.1.0)에서 사용할 수있는 경우 :
awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file