나는 다음 명령을 가지고 있습니다 :
sed -i 's/^CREATE DATABASE.*$//' world.sql
실행하면 다음과 같이 표시됩니다.
sed: -I or -i may not be used with stdin
그리고 .라는 이름의 새 파일을 만듭니다 orld.sql
. 원본 파일은 이후에도 여전히 존재합니다.
그래서 저는 명령 을 sed
보고 있는 걸까요 ? 이 동작을 방지하려면 어떻게 해야 합니까?world.sql
w orld.sql
[이것은 macOS입니다. ]
답변1
제가 아는 한, sed
MacOS에는 FreeBSD 버전이 있는데,필요이 옵션을 사용할 때 제공할 백업 접미사입니다 -i
. 나타나는 오류 메시지는 옵션을 제공하지 않고 옵션을 사용했기 때문에 명령의 일부를 잘못 해석했음을 의미합니다.
그러니 한번 시도해 보세요
sed -i".backup" 's/^CREATE DATABASE.*$//' world.sql
world.sql.backup
그러면 내부 편집이 생성 되고 수행됩니다 world.sql
.
일부 sed
버전에서는 빈 백업 접미사를 허용할 수 있습니다. 예를 들어 sed -i ''
이렇게 하면 백업 파일이 생성되지 않지만 사용 중인 특정 버전에 대한 설명서를 확인해야 합니다. 바라보다
더 많은 통찰력을 얻으려면
답변2
명령줄이 무엇을 의미하는지 더 자세히 조사해야 합니다.sed
sed -i 's/^CREATE DATABASE.*$//' world.sql
macOS sed 호출의 구문은 다음과 같습니다.
sed-i'접미사''주문하다'파일 이름
옵션 접미사는 필수입니다 -i
. 접미사가 비어 있는 경우 -i
와 같이 접미사와 접미사 사이에 최소한 하나의 공백이 있어야 합니다 -i ''
. 이는 귀하의 경우와 마찬가지로 macOS sed 에 대한 것입니다.
예를 들어 , GNU의 sed
경우 와 접미사 사이에 공백이 없어야 합니다.-i
-i''
따라서 이상한 문자열은
s/^CREATE DATABASE.*//
백업을 저장하는 데 사용된 파일 이름에 추가된 접미사인 것 같습니다.짐작할 수 있듯이 원하는 파일 이름이
world.sql
적용할 sed 명령이 됩니다.
-e 옵션을 사용하지 않았으므로 하나의 명령만 필요합니다. 물론 세미콜론으로 구분하고 매개변수를 인용하면 더 많은 정보를 제공할 수 있습니다. 그러나 이것은 우리와는 아무 상관이 없습니다.
짐작할 수 있듯이 이는 명령 끝에 오는
w
이름이 무엇이든 파일에 패턴 공간을 쓰는 유효한 sed 명령입니다 .w
그래서 sed는 이라는 파일을 생성하여
orld.sql
실행 단계에서 이를 채울 준비를 합니다.이제 명령줄에는 아무것도 없으므로 sed는 데이터가 표준 입력에서 오는 것으로 생각합니다. 따라서 sed의 메시지가 표시되지만
-i
모드에서는 stdin에서 데이터를 가져올 수 없습니다.
답변3
매직 인수를 사용하면 --
대부분의 버전 sed
(및 기타 많은 CLI 도구)에 스위치 제공이 완료되었으며(일반적 -
으로 또는 로 시작 --
) 명령줄의 나머지 부분이 인수로 구문 분석되어야 함을 알릴 수 있습니다. 이와 같이:
$ sed --in-place 's/^CREATE DATABASE.*$//' -- world.sql
그러나 전체 줄을 삭제하려는 경우에는 바꾸기 명령을 사용하는 것이 더 깔끔할 수 있습니다.
$ sed --in-place '/^CREATE DATABASE/d'
귀하의 질문에는 MacOS라는 태그도 붙어 있습니다. Mac은 일반적으로 Linux에 포함된 도구 이외의 일부 도구의 BSD 버전을 사용하며 sed
필수입니다 --in-place
. 그러나 이 인수가 빈 문자열인 경우 다른 POSIX와 동일하게 작동합니다.
$ sed --in-place '' '/^CREATE DATABASE/d'