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


142

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

2
당신이 -i깃발 을 시도 할 때 사용하는 정확한 명령은 무엇입니까 ?
eldarerathis

답변:


282

-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비파괴 적 으로 사용 하고, 완전히 종료되었는지 테스트 한 다음 외부 파일 만 제거해야합니다.


-i 플래그 다음에 확장자를 생략하고 있습니다. 가 -i''잠재적으로 원본 파일을 엉망으로 (더 백업이없는) 이외의 이유로 위험?
일요일 월요일

sed매뉴얼 페이지 에 따르면 장치의 디스크 공간이 부족하면 중간에 파일이 손상되어 출력 결과가 나빠질 수 있습니다. sed -i ""백업없이 로컬 소스 제어 하에서 작업하는 경우 대부분의 경우 (또는 git init && git add -A . && git commit -m 'backup'sed를 -i모드 에서 실행하기 직전에) 양호해야합니다 .
cfeduke

2
나는 약간 위험한 비트가 특히 유용하다는 것을 알았습니다. +1
Andre

5
BSD sed는 -i 플래그 뒤에 공백이 없어야합니다. 따라서 -i''유효하지만 유효 -i ''하지 않습니다.
Todd A. Jacobs

3
아아! BSD sed는 '\ n'문자를 무시하고 대신 'n'을 인쇄합니다! 내 Mac에서 BSD sed를 GNU sed로 교체하려고합니다!
nterry

20

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

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

작동하지 않지만

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

잘 작동합니다.


이것은 이제 다른 방향입니다. sed -i '' <file>작동하지만 sed -i'' <file>더 이상 작동하지 않음
Zohaib Amanzai


4

이미 제안 된대로 -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

4

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


Mac OS Catalina와 동일합니다. -i와 -e를 개별적으로 전달하면 (-ie together!) '-e'가 추가 된 백업 파일이 생성됩니다.
Daniel Kesner

1

당신이 사용할 수있는:

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

예:

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

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


2
이렇게하면 '-e'가 추가 된 Mac OS Catalina에서 백업 파일이 생성됩니다.
Daniel Kesner

이것은 macOS에 잘못되었습니다. "man sed"페이지를보십시오. -imacOS에 대한 인수가 필요합니다. 하나를 지정하지 않으므로을 사용하므로 -e두 번째 파일이 -e추가됩니다. -emacOS에는 존재하지 않습니다 -E. macOS에 대한 올바른 명령은 다음과 같습니다sed -i '' -E 's/Hello/Bye/' file.txt
Marc J. Schmidt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.