sed: `'1{/^$/d}'`를 사용하는 정규식은 무엇을 합니까?

sed: `'1{/^$/d}'`를 사용하는 정규식은 무엇을 합니까?

쉘 스크립트를 보는 동안 나는 다음 줄을 발견했습니다.

sed '1{/^$/d}' $file1 >> $file2

여기서 요점은 무엇입니까 sed '1{/^$/d}'?

답변1

1행이 비어 있으면 삭제하세요.

  • 1{- 1호선에 있는 경우
  • /^$/- 이것은 빈 줄입니다.
  • d- 라인 삭제
  • }- 조건 종료

아래 예.

$ cat x1

Hello
World
$ sed '1{/^$/d}' x1 >x2
$ cat x2
Hello
World
$

답변2

GNU sed표현식

1{/^$/d}

어느 것이 쓰기에 더 이식성이 좋나요?

1{/^$/d;}

또는

1 {
    /^$/ d
}

두 부분으로 나누어집니다:

  1. 1 {...}
  2. /^$/ d

현재 줄이 입력의 첫 번째 줄인 경우 첫 번째 부분은 중괄호 안에 명령을 실행합니다.

d현재 줄이 비어 있는 경우, 즉 줄의 시작 부분 ^뒤에 줄 끝이 오면 $두 번째 부분이 명령을 트리거합니다. 이 d명령은 현재 입력을 버리고 다음 루프를 즉시 시작합니다. 즉, 다음 입력 줄로 점프하고 처음부터 표현식을 평가합니다.

1와 둘 /^$/주소후속 명령이 적용될 줄에 영향을 줍니다.

즉, sed입력의 첫 번째 줄이 비어 있으면 명령은 다른 빈 줄을 삭제하지 않고 해당 줄을 삭제합니다.

표현 방식

/^$/ { 1 d; }

동일한 작업을 수행하지만 sed모든 입력 줄에서 정규식 일치를 수행해야 하므로 비용이 더 많이 들 수 있습니다(입력 크기가 크고 컴퓨터가 매우 느리지 않으면 차이를 느낄 수 있을지 의심스럽습니다).


그 외에도 명령에서 변수를 인용해야 할 가능성이 높으며 에 무엇이 있는지 모르기 때문에 $file1명령이 실수로 대시로 시작하는 값을 옵션 집합으로 해석하는 것을 방지하는 것이 좋습니다.

sed -- '1 { /^$/ d; }' "$file1" >>"$file2"

또는,

sed -e '1 { /^$/ d; }' -- "$file1" >>"$file2"

또는 sed표준 입력에서 읽는 경우,

sed '1 { /^$/ d; }' <"$file1" >>"$file2"

당신은 또한 볼 수 있습니다

관련 정보