Sed는 교체 명령이 파일에 작성된 경우 파일의 짝수 라인에서만 교체합니다.

Sed는 교체 명령이 파일에 작성된 경우 파일의 짝수 라인에서만 교체합니다.

파일에 모든 바꾸기 명령이 있고(replace.sed) sed의 -f 플래그(sed -f replacement.sed InputFile)와 함께 사용합니다. 하지만 이제 주어진 입력 파일의 짝수 라인(예: 2,4,6 라인에만 해당)에만 이러한 대체 규칙을 적용해야 하는 상황이 발생했습니다. 대체에 어떤 조건문도 넣을 수 없습니다. .sed 파일은 다른 스크립트에서도 사용됩니다.

답변1

프로세스 대체를 사용하여 sed파일의 명령을 즉시 조정합니다.

$ cat replace.sed
s#foo#bar#

.

$ printf "foo\nfoo\nfoo\nfoo\n" | sed -f replace.sed
bar
bar
bar
bar

.

$ printf "foo\nfoo\nfoo\nfoo\n" | sed -f <(sed 's#^#2~2#g' replace.sed)
foo
bar
foo
bar

답변2

sed -f <(sed -e 's/.*/2~2{&;}/' replace.sed) InputFile

답변3

다른 답변이 당신에게sed 말하려는 것은 의 주소 형식을 사용하는 것입니다 .first~step

구애

    … 다음 주소 유형이 지원됩니다: …

    첫 번째~단계
      다음마다 일치단계line으로 시작하는 '번째 줄첫 번째. 예를 들어, " sed -n 1~2p"는 입력 스트림의 모든 홀수 라인을 인쇄하고 주소 " 2~5"는 두 번째 라인부터 시작하여 매 5번째 라인과 일치합니다.  첫 번째0일 수 있습니다. 이 경우에는 sed다음과 같은 것처럼 작동합니다. 단계. (이것은 확장입니다.)

확실한 해결책은 replace.sedwith 2~2 (또는 0~2의 버전에서 작동하는 경우 sed)의 모든 명령 앞에 명령이 두 번째 줄부터 시작하여 다른 모든 줄에서 작동하도록 하는 것입니다(즉, 입력 스트림의 모든 짝수 줄, 요청하신대로). 그런데 수정할 수 없다고 하더군요 replace.sed. 글쎄, 다음 단계 (다른 답변으로 식별되었지만 설명되지는 않음)는 쉘의프로세스 대체의 출력인 파일처럼 작동하는 기능입니다 . 귀하의 질문에서 알 수 있듯이 일련의 간단한 대체 명령이라면 <(command_list)command_listreplace.sed

sed -f <(sed 's/^/2~2/g' replace.sed)

작동해야합니다.

그러나 여기에는 단점이 있습니다.

  • 한 줄에 여러 명령이 있는 경우 위의 내용은 각 줄의 첫 번째 명령에만 영향을 미칩니다.
  • 숫자 주소(예: )가 있는 명령이 있는 경우 42s/Zaphod/Beeblebrox/해당 명령은 예를 들어 로 변환되어 2~242…분명한 결과를 얻게 됩니다.
  • 그리고 숫자가 아닌 주소(예: /windows/s/command/cmd/)가 포함된 명령이 있는 경우 위의 명령은 완전히 실패합니다.

이러한 경우 중 하나라도 해당되면 다음을 사용해야 합니다.

sed -f <(sed -e 's/.*/2~2{&;}/' replace.sed)

sed각 줄의 모든 명령을 명령 그룹에 넣는 변형입니다 .

replace.sed그러나 여러 줄의 명령이 있으면 이 방법도 실패합니다 .

위의 아이디어를 바탕으로 저는 생각해냈습니다.

sed -f <(echo '0~2{'; cat replace.sed; echo '}')

이는전체 replace.sed명령 그룹에 파일을 넣으십시오. 피상적인 테스트에서 이는 다른 솔루션에서 제기한 우려 사항을 해결하는 것으로 보입니다. 매우 길거나 replace.sed매우 복잡한 명령에 문제가 있어도 놀라지 않을 것입니다 .

관련 정보