"sed -e"와 여러 명령을 세미콜론으로 구분하는 것의 차이점

"sed -e"와 여러 명령을 세미콜론으로 구분하는 것의 차이점

제가 여기저기서 잔소리를 하고 있을지도 모르지만, 저를 괴롭혔던 이 질문이 한번에 답을 얻었으면 좋겠습니다...

다음을 나타내는 텍스트 파일:

Line one.
Line two.

Line three.
Line four.

sed이 텍스트 파일에 빈 줄을 일관되게 추가하려면 줄당 두 개의 명령이 필요합니다. 이는 다음 구문 중 하나를 사용하여 달성할 수 있습니다.

  1. sed -e '/^$/d' -e '$!G' <file>...하지만 그렇지 않습니다 ( sed -e '/^$/d' '$!G' <file>또는 sed '/^$/d' '$!G' <file>)
  2. sed -e '/^$/d; $!G' <file>또는sed -e '/^$/d ; $!G' <file>
  3. sed '/^$/d; $!G' <file>또는sed '/^$/d ; $!G' <file>

내 질문은 다음과 같습니다

  1. 위에 나열된 다섯 가지 작업 구문 사이에 실제 차이점(일반성, 규정 준수 여부...)이 있습니까?
  2. 리처드 블룸의 최신작명령줄 및 쉘 스크립팅 성경sed -e 's/brown/red/; s/dog/cat/' data1.txt다음 조언을 하기 전에 이와 같은 것을 사용하라고 말하는데...

명령은 세미콜론(;)으로 구분해야 하며, 첫 번째 명령 끝과 세미콜론 사이에는 공백이 있어서는 안 됩니다.

-e... 그런 다음 옵션을 전혀 사용하지 않고 명령 끝과 세미콜론 사이에 공백을 추가하는 등 자신의 조언을 완전히 무시합니다 (위 #3의 두 번째 변형에서와 같이).세미콜론 주위의 간격이 실제 차이를 만들어냅니까??

  1. 맨페이지나 문서에서 이에 대한 정보를 찾을 수 없지만 -e위의 구문 #1에 표시된 대로 옵션을 사용해야 하며 명령줄에서 및 를 모두 사용하는 것은 중복된다는 것이 직감입니다 -e. ;내가 맞나요?

편집하다: 더 구체적으로 설명하기 위해 원래 질문에서 이것을 언급했어야 했지만 일부 사람들이 이미 지적했듯이 이러한 뉘앙스는 Branch( b) 또는 test( ) 명령을 사용할 t때 중요합니다 . 그러나 영향을 미치는 다른 상황에 주목하는 것은 흥미롭습니다. 감사해요!

답변1

이는 일부 명령의 경우 매우 중요합니다.

원래 sed구현 에서는 레이블에 대한 분기 , 조건부 분기를 : foo;bar각각 정의합니다 .b foo;bart foo;barfoo;bar

POSIX에서도 필수 사항이었습니다(저는 그랬습니다.요건 완화 요청).

w foo;bar모든 준수 구현에서는 여전히 r foo;bar파일에 쓰거나 파일에서 읽습니다 .foo;bar

#(주석용) 명령 , a, i, c(추가, 삽입, 변경)은 분명히 같은 줄에서 다른 명령 뒤에 올 수 없습니다.

기록 sed구현에서는 다른 명령을 따르는 것도 지원하지 않습니다 }.

;POSIX에서는 before 를 가질 수 없다고 말한 적이 있지만 }실제로는 그럴 필요가 없습니다(나도이 요건을 완화해 달라고 요청하세요).

sed -e cmd1 -e cmd2

에 해당하는 것을 의미

sed -e 'cmd1
cmd2'

그러나 실제로 모든 구현이 다음을 수행하는 것은 아닙니다.

sed -e 'a\' -e 'foo\' -e 'bar'
sed -e 's/foo/bar\' -e 'baz/g'

예를 들어.

답변2

사용하자Sed POSIX 표준질문에 답하십시오.

세미콜론 주위의 간격이 실제 차이를 만들어냅니까?

{...}, a, b, c, i, r, t, w, : 및 # 이외의 편집 명령 뒤에는 세미콜론, 선택적 공백 문자 및 다른 편집 명령이 올 수 있습니다.

따라서 /^$/d ; $!G요구 사항을 충족하지는 않지만 /^$/d; $!G요구 사항을 충족합니다. 그러나 현대 Sed 구현에서 이 문제를 발견할 수 있을지 궁금합니다.

위에 나열된 세 가지 구문 사이에 실제 차이점(일반성, 규정 준수...)이 있습니까?

아니요(위와 같이 세미콜론 앞의 공백 제외). 이는 시놉시스에서 매우 명확하게 설명됩니다.

sed [-n] script [file...]  
sed [-n] -e script [-e script]... [-f script_file]... [file...]

그러나 앞서 언급했듯이 일부 명령 뒤에는 세미콜론이 올 수 없습니다.

sed -e ':a' -e 's/x/y/' -e 't a'

규정을 준수하는 동시에

sed ':a;s/x/y;t a'

그렇지는 않지만 적어도 GNU Sed에서는 동일하게 작동합니다.

내 직감은 -e명령줄에서 (...)와 (...)를 모두 사용하는 것이 중복된다는 것입니다. ;내가 맞나요?

질문의 예를 참고하면 그렇습니다. 옵션이 하나만 있는 경우 -e 해당 옵션을 제거하면 모든 것이 동일해집니다(해당 -f옵션도 사용하지 않는 한(요약 참조)). 하지만

sed -e ':a' -e 's/x/y;t a'

및 존재 -e하지만 ;중복되지는 않습니다.

답변3

이점은 편집 명령인 것 같습니다.

sed -e '/first/a This is cool' -e '/second/i also cool' < <(echo first; echo second)

생산할 것입니다:

first
This is cool
also cool
second

하지만 노력 중

sed -e '/first/a This is cool ; /second/i also cool' < <(echo first; echo second)

생산하다

first
This is cool ; /second/i also cool
second

분명히 세미콜론은 첨부된 부분으로 해석됩니다. 단 하나의 명령으로 이 작업을 수행할 수는 있지만 다음과 같습니다.

sed -e '/first/a This is cool
/second/i also cool' < <(echo first; echo second)

하드 리턴을 활용하여 새 명령을 시작합니다(스크립트 파일이 올바르게 실행되도록 허용).

진실:

sed '
/first/a This is cool
/second/i also cool' < <(echo first; echo second)

관련 정보