존재하다이것편집하다
스티븐 차제라스 POSIX 기반 (다시)식 나누기와 다른 식 문을 sed
삽입하여 서식을 지정 합니다 . 이제 댓글로 이유를 물어봐도 될 것 같았는데 이 답변은 이미 버전 18에 있고 이전 답변 거의 모두 이미 비슷한 공짜가 있습니다. 감사합니다.-e
-e
(삭제된 댓글을 보시면 무슨 말인지 아실 겁니다.). 그리고 나생각하다나는 이것이 왜 더 일반적으로 유용할 수 있는 방식으로 표현되어야 하는지 충분히 이해합니다. 그럼 희망사항은...
나는 일반적으로 가능하다면 전체 표현을 1로 유지하는 것을 선호 sed
-e
하지만 다음을 따르는 것도 선호합니다.사양가능한 한 가깝습니다. 특히 차이가 a <space>
와 an 이하인 경우에는 더욱 그렇습니다 -e
. 하지만 이해하지 못하면 할 수 없습니다.왜그래야 해요. 다음은 현재 이해에 대한 간략한 개요입니다.
인터럽트는
' -e '
명령줄 명령문에서sed
스크립트\n
ewline 인터럽트를 대체할 수 있습니다.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
이제 이 질문에 대한 답을 얻을 차례입니다. 비록 저는 직관으로 답을 얻었지만어떻게거의 모든 경우에 이를 올바르게 수행하기 위해 얼마 전 저는 최근에야 표준의 텍스트에 대한 상당히 구체적인 이해를 발전시킬 수 있었습니다. 실제로는 매우 간단하게 설명되어 있습니다. 제가 어리석게도 여러 번 간과했던 것 같습니다.
본문의 관련 부분은 제목 아래에서 확인할 수 있습니다.
-
논쟁텍스트하나 이상의 줄로 구성되어야 합니다.
\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
.
- 스크립트- 사용할 문자열스크립트편집 명령. 신청이 불가합니다스크립트이는 마지막 문자가 ewline일 필요가 없다는 점을 제외하면 텍스트 파일의 제한 사항을 위반합니다
따라서 전체적으로 생각해 보면 미리 정의된 구분 기호 없이 임의의 인수가 선택적으로 뒤에 올 수 있는 모든 명령이 의미가 있습니다.( 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]
있으며 둘 다 텍스트 파일로 해석됩니다.( \n
ewline으로 끝나는 것을 지정)하지만 사실 그럴 필요는 없다.끝줄 에 \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...'
...위 명령 중 하나(제외하고 :
)또한 적어도 하나를 수락하십시오.주소/
정규식 /
이나 줄 번호 일 수 있고 부정할 수 있지만 !
단일 평가에 여러 명령이 필요한 경우주소그런 다음 {
함수 컨텍스트를 사용하여 중괄호를 구분해야 합니다. }
함수에는 \n
ewline으로 구분된 여러 명령이 포함될 수도 있지만, 그렇지 않은 경우 각 명령은 중괄호로 구분되어야 합니다.
이것이 이식 가능한 스크립트를 작성하는 방법입니다 sed
.