BSD를 사용하십시오 sed.

BSD를 사용하십시오 sed.

BSD를 사용하십시오 sed.

다음 대체를 어떻게 수행할 수 있습니까? :

앞으로:

hello hello hello
hello hello hello

뒤쪽에:

hello world hello
hello hello hello

즉, 어떻게 교체할 수 있습니까?이것 질소 발생하다패턴?
(또는 이 경우;이것 2ND 발생하다패턴? )

답변1

모든 POSIX의 경우 sed:

$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
  • 첫 번째 게임이 끝난 후 /hello/우리는 계속해서 혼란에 빠졌습니다.

  • 루프 내에서 각 ext 행을 패턴 공간으로 읽어 :1들여 Nnd가 발생할 때만 바꾸기 명령을 실행합니다 s. 교체가 성공했는지 추정 2해보겠습니다 . t그렇다면 루프가 발생하고 :2, 그렇지 않으면 루프가 반복됩니다 b1.

  • 루프 내부에서는 :2파일 끝까지 남은 줄을 인쇄합니다.

이 방법은 둘 사이의 모든 것을 저장합니다.안녕하세요패턴 공간에서. 이는 첫 번째 파일과 두 번째 파일이 서로 멀리 떨어져 있는 경우 대용량 파일에서 문제가 됩니다.

답변2

두 개의 s 를 사용하면 더 쉬울 것입니다 sed. 사실 이런 일이 많으며, 종종서둘러요적어도 이것은 멀티 코어 시스템에서는 사실입니다.

:    infile =;<<"" \
sed -e's/$/ /;s/hello/&\n\n/g' -e'# marks lines with " $" and splits matches' |
sed -e:n   -e's/ $//;t'  -eG   -e'# sets up a test label, branches for " $"'  \
    -e's/o\n\{20\}$/o world/'  -e'# stacks a byte per match, edits nth match' \
    -e'x;N;x;N;s/\n\n*//;tn'   -e'# completes the stacking; recycles to top'  \
>outfile
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello

hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello world hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello

(BSD의 경우 sed오른쪽 대체 필드의 이스케이프 문자를 리터럴 개행 문자로 바꿔야 합니다 n.)\n

흐름을 조정하는 것은 일반적으로 흐름 편집기를 조정하는 것보다 쉽습니다. 위의 시퀀스는 바로 그 일을 합니다. 입력의 모든 전체 줄을 후행 공백으로 표시하지만 그렇지 않으면 각 발생에 대해 출력 줄을 분할합니다.hello. 그런 다음 두 번째 줄은 sed스택 수를 늘려야 한다는 것을 알기 위해 공백으로 끝나지 않는 줄을 찾은 다음 20번째 줄과 명시적으로 일치해야 합니다.

물론 그렇게 엄격할 필요는 없습니다. 넌 선두를 포기해도 돼o전에 \n\{20\}$교체를 유지하십시오. 그건 단지 대체할 뿐입니다~에서20번째 일치부터 입력의 마지막 일치까지입니다. 아니면 \n\{20,25\}일련의 일치 항목을 처리할 수도 있습니다. 짝수: \n\{20,25\}\(\n\{15\}\)*$20,25 범위와 그 이후 10,15번 발생마다 처리합니다.

다음은 마지막으로 언급한 것과 동일한 입력이 제공된 출력 예입니다.


hello hello hello hello hello hello hello hello hello
hello hello hello hello hello hello hello hello hello
hello hello world hello world hello world hello world hello world hello world hello hello
hello hello hello hello hello hello hello hello world hello world
hello world hello world hello world hello world hello hello hello hello hello
hello hello hello hello hello world hello world hello world hello world hello world
hello world hello hello hello hello hello hello hello hello

관련 정보