제가 여기저기서 잔소리를 하고 있을지도 모르지만, 저를 괴롭혔던 이 질문이 한번에 답을 얻었으면 좋겠습니다...
다음을 나타내는 텍스트 파일:
Line one.
Line two.
Line three.
Line four.
sed
이 텍스트 파일에 빈 줄을 일관되게 추가하려면 줄당 두 개의 명령이 필요합니다. 이는 다음 구문 중 하나를 사용하여 달성할 수 있습니다.
sed -e '/^$/d' -e '$!G' <file>
...하지만 그렇지 않습니다 (sed -e '/^$/d' '$!G' <file>
또는sed '/^$/d' '$!G' <file>
)sed -e '/^$/d; $!G' <file>
또는sed -e '/^$/d ; $!G' <file>
sed '/^$/d; $!G' <file>
또는sed '/^$/d ; $!G' <file>
내 질문은 다음과 같습니다
- 위에 나열된 다섯 가지 작업 구문 사이에 실제 차이점(일반성, 규정 준수 여부...)이 있습니까?
- 리처드 블룸의 최신작명령줄 및 쉘 스크립팅 성경
sed -e 's/brown/red/; s/dog/cat/' data1.txt
다음 조언을 하기 전에 이와 같은 것을 사용하라고 말하는데...
명령은 세미콜론(;)으로 구분해야 하며, 첫 번째 명령 끝과 세미콜론 사이에는 공백이 있어서는 안 됩니다.
-e
... 그런 다음 옵션을 전혀 사용하지 않고 명령 끝과 세미콜론 사이에 공백을 추가하는 등 자신의 조언을 완전히 무시합니다 (위 #3의 두 번째 변형에서와 같이).세미콜론 주위의 간격이 실제 차이를 만들어냅니까??
- 맨페이지나 문서에서 이에 대한 정보를 찾을 수 없지만
-e
위의 구문 #1에 표시된 대로 옵션을 사용해야 하며 명령줄에서 및 를 모두 사용하는 것은 중복된다는 것이 직감입니다-e
.;
내가 맞나요?
편집하다: 더 구체적으로 설명하기 위해 원래 질문에서 이것을 언급했어야 했지만 일부 사람들이 이미 지적했듯이 이러한 뉘앙스는 Branch( b
) 또는 test( ) 명령을 사용할 t
때 중요합니다 . 그러나 영향을 미치는 다른 상황에 주목하는 것은 흥미롭습니다. 감사해요!
답변1
이는 일부 명령의 경우 매우 중요합니다.
원래 sed
구현 에서는 레이블에 대한 분기 , 조건부 분기를 : foo;bar
각각 정의합니다 .b foo;bar
t foo;bar
foo;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)