Programming

OS X에서 sed를 사용한 전체 편집

procodes 2020. 7. 4. 11:58
반응형

OS X에서 sed를 사용한 전체 편집


OS X에서 sed로 파일을 편집하고 싶습니다. 다음 명령을 사용하고 있습니다.

sed 's/oldword/newword/' file.txt

출력이 터미널로 전송됩니다. file.txt 는 수정되지 않습니다. 변경 사항은 다음 명령 으로 file2.txt 에 저장됩니다 .

sed 's/oldword/newword/' file1.txt > file2.txt

그러나 나는 다른 파일을 원하지 않습니다. 그냥 file1.txt 편집하고 싶습니다 . 어떻게해야합니까?

-i 플래그를 시도했습니다. 다음과 같은 오류가 발생합니다.

sed: 1: "file1.txt": invalid command code f

-i백업 된 파일에 추가 할 접미사를 제공 하여 플래그를 올바르게 사용할 수 있습니다 . 예를 확장 :

sed -i.bu 's/oldword/newword/' file1.txt

두 개의 파일을 제공합니다. 하나 file1.txt는 대체를 포함하는 이름 가진 파일 file1.txt.bu원래 내용을 가진 이름 을 가진 파일입니다.

약간 위험

원본 파일을 파괴적으로 덮어 쓰려면 다음과 같이 사용하십시오.

sed -i '' 's/oldword/newword/' file1.txt
      ^ note the space

행이 구문 분석되는 방식으로 인해 인수의 길이가 0이므로 옵션 플래그와 인수 사이에 공백이 필요합니다 .

원본을 쓰레기로 버리는 것 외에는 이런 식으로 sed를 속일 수있는 더 이상의 위험을 알지 못합니다. 그러나이 호출이 sed스크립트의 일부인 경우 , Unix Way ™ (IMHO)는 sed비파괴 적 으로 사용 하고, 완전히 종료되었는지 테스트 한 다음 외부 파일 만 제거해야합니다.


MacOS와 비슷한 문제가 있습니다

sed -i '' 's/oldword/newword/' file1.txt

작동하지 않지만

sed -i"any_symbol" 's/oldword/newword/' file1.txt

잘 작동합니다.


이미 제안 된대로 -i''( --in-place)을 사용할 수 있습니다 sed. 참조 : 에 적절한 인수 , 그러나주의 옵션은 표준이 아닌 FreeBSD의 확장이며, 다른 운영 체제에서 사용하지 못할 수 있습니다. 두 번째 파일 편집기가 아닌 S tream ED itor 입니다.-i-ised


다른 방법은 다음과 같이 Vim Ex 모드에서 내장 대체를 사용하는 것입니다.

$ ex +%s/foo/bar/g -scwq file.txt

여러 파일의 경우 :

$ ex +'bufdo!%s/foo/bar/g' -scxa *.*

모든 파일을 재귀 적으로 편집하려면 **/*.*셸에서 지원하는 경우 (로 활성화 shopt -s globstar) 사용할 수 있습니다 .


또 다른 방법은 다음 gawk과 같은 새로운 "inplace"확장을 사용하는 것입니다.

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1

당신이 사용할 수있는:

sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>

예:

sed -i -e 's/Hello/Bye/' file.txt

이것은 Mac 에서 완벽하게 작동합니다 .


sed -i -- "s/https/http/g" file.txt

백업 파일이 생성됩니다. sed -i -e 's/hello/hello world/' testfile들어 , 같은 디렉토리에 testfile-e 백업 파일을 만듭니다.

참고 URL : https://stackoverflow.com/questions/7573368/in-place-edits-with-sed-on-os-x

반응형