"-i" 옵션과 함께 "sed"를 사용하면 입력 파일은 변경되지 않은 채 이상한 이름의 새 파일이 생성됩니다.

"-i" 옵션과 함께 "sed"를 사용하면 입력 파일은 변경되지 않은 채 이상한 이름의 새 파일이 생성됩니다.

나는 다음 명령을 가지고 있습니다 :

sed -i 's/^CREATE DATABASE.*$//' world.sql

실행하면 다음과 같이 표시됩니다.

sed: -I or -i may not be used with stdin

그리고 .라는 이름의 새 파일을 만듭니다 orld.sql. 원본 파일은 이후에도 여전히 존재합니다.

그래서 저는 명령  을 sed보고 있는 걸까요 ? 이 동작을 방지하려면 어떻게 해야 합니까?world.sqlw orld.sql

[이것은 macOS입니다. ]

답변1

제가 아는 한, sedMacOS에는 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'

관련 정보