이 sed 스크립트를 사용해보십시오 :
그것은 매우 hackish하고 두 가지에 의존합니다 : 텍스트는 '|'기호를 포함하지 않습니다. 마지막 줄은 'http :'로 시작합니다.
:again
${
s/\n/|/g
# to include first part too
s/^/|/
:next
# modify last non processed part
s/\(.*\)|\([^|]\+\)|\(.*\)\(http:.*\)/\1|\4\/\2\n\3\4/
t next
# remove unneeded guard
s/^|//
# remove prefix
s/\(.*\n\)\([^\n]\+\)/\1/
b end
}
N
b again
:end
어떻게 작동합니까?
우리가 다음과 같은 내용을 가지고 있다고 가정 해보십시오.
aaa
bbb
http://zzz
먼저, 스크립트는 파일의 모든 라인을 내부 버퍼에 결합합니다.
:again
${
# Here internal buffer will be processed
b end
}
N
b again
:end
내 스크립트에서 sed가 줄 단위로 텍스트를 처리 할 수 없을 때 매우 일반적인 패턴입니다.
그리고 입력은별로 크지 않습니다. 첫 줄 스크립트에서 시작하는 것은 인터럽트하지 않고
끝까지 버퍼에 다음 행 ( 'N')을 읽으십시오.
마지막 행 ( '$')을 얻으면 더 처리 할 수 있습니다. 그리고 그것이 끝나면
중지 ( 'b 끝'). 하나는 끝까지 도달하기 위해 difinite 레이블을 사용할 수 없으며, 단지 'b'가됩니다.
너무 일하지만 선명도가 더 좋습니다.
이제 내부 버퍼에 다음 텍스트가 있습니다.
aaa\nbbb\nhttp://zzz
다음으로 '|'기호로 라인을 구분합니다. '\ n'대신 :
s/\n/|/g
# to include first part too
s/^/|/
|aaa|bbb|http://zzz
그런 다음이 패턴을 찾습니다.
...|text|.....http://...
그것을 다음과 같이 변경하십시오
...|http://...text\n.....http://...
사용 된 정규 표현식의 greeding 특성으로 인해 대치는 끝에서부터 끝까지 발생합니다.
하나의 기호 '|'를 제거하는 각 단계에서 문자열의 시작 :
Initial state of buffer:
|aaa|bbb|http://zzz
After first step:
|aaa|http://zzz/bbb\nhttp://zzz
After second step:
|http://zzz/aaa\nhttp://zzz/bbb\nhttp://zzz
루프는 명령 't 다음'의 도움으로 구성되었습니다. 레이블 '다음'으로 이동합니다.
마지막 대체가 성공한 경우.
다음으로 불필요한 가드 '|'를 제거합니다. 줄의 시작 부분에 :
s/^|//
http://zzz/aaa\nhttp://zzz/bbb\nhttp://zzz
그리고 마지막 줄 :
s/\(.*\n\)\([^\n]\+\)/\1/
http://zzz/aaa\nhttp://zzz/bbb
그래서, 마침내 버퍼를 인쇄하면 다음과 같이 나타납니다 :
http://zzz/aaa
http://zzz/bbb