앞으로 그것을 피하는 방법

앞으로 그것을 피하는 방법

다음을 사용하여 sed디렉토리에 있는 여러 파일의 단어를 다른 단어로 바꾸려고 합니다.

sed -n -i 's/pattern/replacement/g' "dir"/*

pattern내 파일에 있는 일치하는 단어가 내 단어로 대체될 것이라고 생각했지만 replacement그렇지 않았고 대신 내부의 모든 파일의 dir내용이 지워졌습니다.

sed's맨페이지 에 따르면 -n, --quiet, --silent패턴 공간의 자동 인쇄를 억제합니다.

내 이해에 따르면 sed텍스트 줄을 처리 하기 전에 sed먼저 배치된 pattern space다음 sed바꾸기 명령과 같은 특정 명령이 적용됩니다.s/// 그런 다음 기본적으로 결과 텍스트를 인쇄합니다..

을 사용하면 텍스트가 에 인쇄되는 것을 -n막는다 고 생각했는데 , 제가 틀렸나봐요. 중요한 파일의 비용이 발생해서 백업하는 것을 잊어버렸습니다 T_Tsedstdout

답변1

sed대표하다"에스트레메편집하다editor". 스트리밍 버전은파일 편집기.

그럼 그게 sed다야고의로사용하려면 항상 표준 출력으로 출력을 생성합니다.그건매뉴얼 및 매뉴얼에서 "인쇄"라는 용어가 사용되는 방법사양.

-i비표준 확장모든 구현에 존재하지 않으며 sed해당 구현에서 동일하게 동작한다고 보장되지 않는 파일을 편집하는 경우하다그것을 구현하십시오. (예를 들어 내 시스템에서는 백업 파일 확장자가 다음과 같기 때문에 명령을 실행하면 오류가 발생합니다.필수의. 즉, 내 시스템에서는 이와 같은 것을 지정한 sed -n -i savemybutt 's/pattern/replacement/g' "dir"/*다음 foo.txt편집하기 전에 각 파일을 백업해야 합니다 foo.txt.savemybutt. )

-i이것이 비표준이고 사후 고려 라는 사실은 구현 문서 sed(GNU sed라고 가정)의 표준 용어가 변경되지 않았으므로 여전히 "출력 생성에서"를 의미하기 위해 "인쇄"라는 용어를 사용한다는 것을 의미합니다.일반적인 의미.

즉, sed표준 작동 모드 에서유일한 방법출력을 생성하는 방법은 표준 출력으로 인쇄하는 것입니다. 파일을 편집할 수 있는 방법이 없습니다. 따라서 표준 작동 모드에서는 인쇄와 출력이 동일합니다. 일단 들어가면 -i상황이 조금 더 어두워지지만 "인쇄"아직"출력 생성"을 의미합니다.일반적인 의미출력이 파일로 되어 있더라도 그것이 "인쇄"되는 것이기 때문입니다.언제나그 의미.

이것의도그게 -n다야오직다음과 같이 명시적으로 인쇄하는 출력을 생성합니다 p.

sed -n '/<body>/,/<\/body/p' < some_html_document.html

body그러면 HTML 문서의 요소가 (대략) 인쇄됩니다 . (물론 이것은 어리석은 예이다.)

답변2

귀하의 설명이 -n정확한 것 같습니다. 하지만 당신은 모르는 것 같습니다 -i.

일반적인 동작은 stdout으로 출력하는 것입니다. 따라서 "내 생각에는 -n을 사용하면 sed가 어떤 텍스트도 표준 출력으로 인쇄하는 것을 막는 것뿐입니다."는 작동을 중지한다는 의미입니다.

그런 다음 -i동작을 변경하여 제자리에 두십시오. 그러나 몇 가지 결과가 있습니다.

앞으로 그것을 피하는 방법

다음 테스트에는 사용되지 않습니다 -i. 따라서 표준 출력으로 출력됩니다. 돌연변이가 발생하지 않았습니다. (함수형 프로그래밍(변이 없음)은 절차형 프로그래밍보다 안전합니다.)

테스트가 실패하지 않는 한 코드를 작성하지 마세요. (문제를 일으키는 stdout이 있습니까?)

답변3

~에 따르면man sed

-n, --quiet, --silent
     suppress automatic printing of pattern space

이것은 유용한 명령이 아닙니다 sed. 다음과 같이 사용할 수 있습니다.

sed -n 's/pattern/replacement/p' "dir"/*

인쇄용.

sed -n -i 's/pattern/replacement/p' "dir"/*

변경된 기록만 저장

sed -i 's/pattern/replacement/g' "dir"/*

일치하는 레코드만 변경

관련 정보