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