휴대용 sed -e... db 또는! B에 관해서?

휴대용 sed -e... db 또는! B에 관해서?

존재하다이것편집하다 스티븐 차제라스 POSIX 기반 (다시)식 나누기와 다른 식 문을 sed삽입하여 서식을 지정 합니다 . 이제 댓글로 이유를 물어봐도 될 것 같았는데 이 답변은 이미 버전 18에 있고 이전 답변 거의 모두 이미 비슷한 공짜가 있습니다. 감사합니다.-e-e(삭제된 댓글을 보시면 무슨 말인지 아실 겁니다.). 그리고 나생각하다나는 이것이 왜 더 일반적으로 유용할 수 있는 방식으로 표현되어야 하는지 충분히 이해합니다. 그럼 희망사항은...

나는 일반적으로 가능하다면 전체 표현을 1로 유지하는 것을 선호 sed -e하지만 다음을 따르는 것도 선호합니다.사양가능한 한 가깝습니다. 특히 차이가 a <space>와 an 이하인 경우에는 더욱 그렇습니다 -e. 하지만 이해하지 못하면 할 수 없습니다.그래야 해요. 다음은 현재 이해에 대한 간략한 개요입니다.

  • 인터럽트는 ' -e '명령줄 명령문에서 sed스크립트 \newline 인터럽트를 대체할 수 있습니다.sed나는 왜 그런지 혼란스럽다는 것을 인정한다.

  • sed {함수의 닫는 중괄호 앞에는 아래와 같이 줄 바꿈 문자 }가 와야 합니다 .\n

    • <right-brace>앞에는 a가 와야 하며 앞 <newline>이나 뒤에 문자가 올 수 있습니다 <blank>.
  • \n다음을 사용한 후에도 ewline 인터럽트가 필요합니다.a, b, c, i, r, t, w, 또는 :.

{그러나 함수 정의가 not 연산자 }와 어떤 관련이 있는지는 명확하지 않습니다 . !사양에서 내가 찾은 부정 연산자에 대한 유일한 언급은 다음과 같습니다.

  • 함수 앞에는 하나 이상의 !문자가 올 수 있으며, 이 경우 주소가 패턴 공간을 선택하지 않으면 함수를 적용해야 합니다.

이것은 중괄호를 사용하는 것을 !의미 합니까 ? 명령은 어떻습니까 ? 구분 기호로 구분해야 합니까 ? 스테판이 최근에 했던 질문인가요?{}$!' -e 'POSIX화내 대답은?

나는 그것이 !부정 연산자이거나 b그가 편집에서 언급한 ranch 문이거나 둘 중 하나라고 생각합니다. 그러나 나는 잘 모르겠고 그렇게 해야 합니다. 의 경우오직b그럼 목장 성명서나는 믿는다a는 d그것을 대체하고 ' -e '휴식의 필요성을 제거하지만 세 번 모험을 떠나기 전에 확인하고 싶습니다.POSIX화답변. 도와주세요?

나는 위험을 무릅썼다결국, 그러나 확실성은 없습니다 ...

답변1

이제 이 질문에 대한 답을 얻을 차례입니다. 비록 저는 직관으로 답을 얻었지만어떻게거의 모든 경우에 이를 올바르게 수행하기 위해 얼마 전 저는 최근에야 표준의 텍스트에 대한 상당히 구체적인 이해를 발전시킬 수 있었습니다. 실제로는 매우 간단하게 설명되어 있습니다. 제가 어리석게도 여러 번 간과했던 것 같습니다.

본문의 관련 부분은 제목 아래에서 확인할 수 있습니다.

  • 편집 명령은sed:

    • 논쟁텍스트하나 이상의 줄로 구성되어야 합니다. \n텍스트에 포함된 각 줄 앞에는 \백슬래시가 와야 합니다. 텍스트의 다른 백슬래시는 제거해야 하며 다음 문자는 문자 그대로 처리해야 합니다.

    • r명령 동사 w와 명령 w플래그는 s선택 사항을 취합니다.r 파일(또는업무 문서) 인수, 명령 동사 문자 또는 플래그로 구분된 하나 이상 <blank>s; 구현에서는 확장으로 공백을 허용할 수 있습니다.

    • {, a, b, c, i, r, t, w및 이외의 :명령 동사 #뒤에는 ;세미콜론, 선택 사항 <blank>s및 다른 명령 동사가 올 수 있습니다. 그러나 s명령 동사를 플래그와 함께 사용하는 경우 w이 방법으로 다른 명령을 뒤에 사용하면 정의되지 않은 결과가 생성됩니다.

...존재하다...

  • 옵션:다중 -e및 옵션을 지정할 수 있습니다. -f모든 명령은 원본에 관계없이 지정된 순서대로 스크립트에 추가되어야 합니다.

    • -e 스크립트- 지정된 편집 명령 추가스크립트종료할 옵션 매개변수스크립트편집 명령. 이것스크립트옵션 매개변수는 옵션 매개변수와 동일한 속성을 가져야 합니다.스크립트피연산자, 설명:피연산자부분.

    • -f 스크립트 파일- 파일에 편집 명령 추가스크립트 파일스크립트 끝까지.

마침내 ...

  • 피연산자:

    • 스크립트- 사용할 문자열스크립트편집 명령. 신청이 불가합니다스크립트이는 마지막 문자가 ewline일 필요가 없다는 점을 제외하면 텍스트 파일의 제한 사항을 위반합니다 \n.

따라서 전체적으로 생각해 보면 미리 정의된 구분 기호 없이 임의의 인수가 선택적으로 뒤에 올 수 있는 모든 명령이 의미가 있습니다.( s d sub d repl d flag예를 들어 반대)이스케이프 되지 않은 줄바꿈으로 \n구분되어야 합니다.

논쟁의 여지가있다; 미리 정의된 구분 기호가 있지만 이 경우 for를 사용하는 ;모든 [aic]명령은 이 세 가지 명령 전용 구현에 별도의 파서를 포함해야 합니다. 즉, for 에 사용되는 파서와는 별개입니다 [:brw]. 그렇지 않은 경우 구현에는 다음이 필요합니다.; 반품백슬래시 내에서 이스케이프텍스트매개변수를 지정하고 거기서부터는 더 복잡해집니다.

만약에나는 sed호환 가능하고 효율적이길 바라는 프로그램을 작성하고 있으므로 별도의 파서를 작성하지 않기를 바랍니다. 단, [aic]ewline을 즉시 따르지 않으면 \n구문 오류가 발생할 수 있습니다 . 그러나 이는 단순한 토큰화 문제입니다. 끝 구분 기호의 경우가 일반적으로 더 문제가 되는 경우입니다. 나는 단지 다음과 같이 쓸 것이다:

sed -e w\ file\\ -e one -e '...;and more commands'

...그리고...

sed -e a\\ -e appended\\ -e text -e '...;and more commands'

...첫 번째 파일은 다음 이름의 파일을 생성하고 기록한다는 점에서 매우 유사하게 동작합니다.

file
one

...두 번째는 현재 출력 줄에 텍스트 블록을 추가합니다.

appended
text

...둘 다 동일한 매개변수 구문 분석 코드를 공유하기 때문입니다.

그런 { ... }의미 에서 $!– 글쎄, 나는 거기에서 멀리 떨어져 있다. 주소가 앞에 오는 단일 명령은 다음과 같습니다.아니요기능이지만 주소 지정 명령일 뿐입니다. 거의모두명령 - 포함{ 기능 정의 }/one/수락 하거나 주소를 지정 하도록 지정되었습니다 /one/,/two/.#논평그리고:태그 정의. 주소는 줄 번호 또는 정규식일 수 있으며, 부정될 수 있습니다 !. 그래서 모두...

$!d
/address/s/ub/stitution/
5!y/d/c/

...표준에 따르면 하나 ;이상의 명령이 뒤에 올 수 있지만 단일 주소에 더 많은 명령이 필요하고 각 명령 후에 주소를 재평가해서는 안 되는 경우 {다음과 같은 기능을 사용해야 합니다.}

/address/{ s//replace addressed pattern/
           s/do other conditional/substitutions/
           s/in the same context/without/
           s/reevaluating/address/
}

... {같은 줄에서는 닫는 문이 뒤에 올 수 없으며, }줄의 시작 부분을 제외하고는 닫는 문이 올 수 없습니다. }그러나 포함된 명령 뒤에 ewline 이 오지 않아야 하는 경우 \n함수 내부에 있을 필요도 없습니다. 따라서 위의 모든 s///대체 항목(닫는 중괄호 포함 ) 뒤에는 편리하게 세미콜론 및 기타 명령이 }올 수 있습니다 .;

나는 Ewline 구분 기호에 대해 이야기해 왔지만 \n문제는 -e표현식 문에 관한 것이라는 것을 알고 있습니다. 하지만 이 둘은 실제로 동일하며 핵심 관계는 다음과 같습니다.스크립트리터럴 명령줄 인수 또는 이들 중 하나가 포함된 파일일 수 -[ef]있으며 둘 다 텍스트 파일로 해석됩니다.( \newline으로 끝나는 것을 지정)하지만 사실 그럴 필요는 없다.줄 에 \n. 이렇게 하면 합리적으로 할 수 있어요(나는 희망)구분된 인수를 추론한다는 \0NUL것은 ewline을 종료 \n하고 모든 호출 인수가적어도)어쨌든 \0NUL구분 기호 중 하나가 제대로 작동합니다.

실제로 실제로 \표준에서 백슬래시로 이스케이프된 개행 문자를 지정하는 경우를 제외한 모든 경우를 찾았습니다...

sed -e ... -e '...\' -e '...'

...역시 작동합니다. 모든 경우에 - 다시 말하지만, 실제로는 - \n이스케이프되지 않은 줄바꿈이 필요합니다...

sed -e '...' -e '...'

...저에게도 효과가 있었습니다. 위에서 언급한 한 가지 예외는...

sed -e 's/.../...\' -e '.../'

...이것은 내 테스트의 어떤 구현에서도 작동하지 않습니다. 나는 이것이 다시 돌아올 것이라고 확신합니다텍스트문서 요구 사항 및 사실s/// 오는구분 기호를 사용하면 단일 문이 구분된 매개 변수에 걸쳐 있을 이유가 없습니다 \0NUL.

요약하면 다음은 sed여러 명령을 작성하는 이식 가능한 방법에 대한 간략한 개요입니다.

다음 중 하나에 해당 [aic]:

...commands;[aic]\
text embedded newline\
delimiting newline
...more;commands...

...또는...

sed -e '...commands;[aic]\' -e 'text embedded newline\' -e 'delimiting newline' -e '.;.;.'

[:rwtb]어느 곳 에서나범위임의로 선택할 수 있는 (를 제외한 모든 사람에게 해당 :)하지만 구분선 \n아니요. 여러 줄을 시도할 이유가 없었습니다.상표[:tb]와 함께 사용되지만 여러 줄을 w평가/ 지정하는 매개변수r[rw]파일sed삽입된 줄바꿈이 백슬래시로 이스케이프되는 한 \n매개변수는 일반적으로 내가 테스트한 에서 의심 없이 허용됩니다 \. 그럼에도 불구하고 표준은 직접적으로 지정하지 않습니다.상표그리고[rw]파일매개변수는 다음과 유사하게 구문 분석되어야 합니다.텍스트\n매개변수 를 구분한다는 점을 제외하면 처음 두 매개변수에 대한 ewline은 언급되지 않습니다 .

...commands;[:trwb] parameter
...more;commands...

...또는...

sed -e '[:trwb] parameter' -e '...'

... <space>위의 내용은 선택 사항입니다 [:tb].

드디어...

...;address[!]{ ...function;commands...
};...more;commands....

...또는...

sed -e '...;address[!]{ ...function;commands...' -e '};...more;commands...'

...위 명령 중 하나(제외하고 :)또한 적어도 하나를 수락하십시오.주소/정규식 /이나 줄 번호 일 수 있고 부정할 수 있지만 !단일 평가에 여러 명령이 필요한 경우주소그런 다음 {함수 컨텍스트를 사용하여 중괄호를 구분해야 합니다. }함수에는 \newline으로 구분된 여러 명령이 포함될 수도 있지만, 그렇지 않은 경우 각 명령은 중괄호로 구분되어야 합니다.

이것이 이식 가능한 스크립트를 작성하는 방법입니다 sed.

관련 정보