두 줄에 걸쳐 있을 수 있는 패턴 바꾸기

두 줄에 걸쳐 있을 수 있는 패턴 바꾸기

NSed 편집기에서 옵션이 어떻게 작동하는지 이해하려고 합니다 . 내 목표는 변화하는 거야"시스템 관리자"도착하다"데스크톱 사용자"내부에"파일 01", 브레이크 라인은 마지막 줄에도 있습니다. sed는 다음 줄이 없기 때문에 마지막 줄을 잡지 못합니다. 다음을 추가하는 등 수정해야 할 또 다른 사항이 있습니다.

sed 's/System Administrator/Desktop User/', 하지만 이것과:

sed 'System\nAdministrator/Desktop\nUser/'명령 중 하나가 마지막 줄 또는 두 줄에 대해 작동을 멈추도록 예상치 못한 방식으로 전환합니다. 이것은 N두 사람 사이에서 또는 두 사람 앞에서 발생합니다. 저는 GNU Sed 버전 4.4를 사용하고 있습니다.

#cat file01
The first meeting of the Linux System
Administrator's group will be held on Tuesday.
Another line
And here we have: System Administrator's Group as well.
1.System Administrator's group.
2.System Administrators Group.
3.System Administrators Group.
The first meeting of the Linux System
Administrator's group will be held on Tuesday.
System Administrators Group.

사례 1, 다음 두 명령N

# sed '
>N
>s/System\nAdministrator/Desktop\nUser/
>s/System Administrator/Desktop User/
> ' file01
The first meeting of the Linux Desktop
User's group will be held on Tuesday.
Another line
And here we have: Desktop User's Group as well.
1.Desktop User's group.
2.System Administrators Group.
3.Desktop Users Group.
The first meeting of the Linux System
Administrator's group will be held on Tuesday.
Desktop Users Group.

사례 2, sed 's/System Administrator/Desktop User/'앞으로 N.

# sed '
> s/System Adminitrator/Desktop User/
> N
> s/System\nAdministrator/Desktop\nUser/
> ' file01
The first meeting of the Linux Desktop
User's group will be held on Tuesday.
Another line
And here we have: System Administrator's Group as well.
1.Desktop User's group.
2.System Administrators Group.
3.Desktop Users Group.
The first meeting of the Linux System
Administrator's group will be held on Tuesday.
System Administrators Group.

이것은 나에게 이상해 보이며 무엇이 잘못되었는지 알 수 없습니다. [편집]: 자세한 내용.

대안을 찾고 있어요"시스템 관리자"그리고"데스크톱 사용자". 또한 한 줄이 "시스템"으로 끝나고 다음 줄이 "관리자"로 시작하는 경우 그에 따라 "데스크톱"과 "사용자"로 바꾸겠습니다. 이 모든 내용은 책에서 가져온 것이지만 결과는 책에 있는 내용과 일치하지 않습니다. 결국 무엇이 잘못되었는지 모르겠습니다. 내 문제를 설명하기 위해 내가 찾은 유일한 세계는 우선 순위입니다. 사과드립니다. 제가 틀린 것 같습니다.

답변1

이는 실제로 우선순위(보통 연산자와 관련)와 관련이 없고 오히려 명령이 실행되는 순서와 관련이 있습니다.


질문의 첫 번째 예를 살펴보십시오.

N
s/System\nAdministrator/Desktop\nUser/
s/System Administrator/Desktop User/

그러면 행을 쌍으로 읽고 두 개의 대체 항목을 적용합니다. 쌍의 두 번째 줄이 System( Administrator다음 세 번째 줄에서)로 끝나면 감지되지 않습니다.이는 문자열이 홀수 줄과 짝수 줄에 걸쳐 있을 때 대체되지 않음을 의미합니다..

질문의 두 번째 예를 살펴보십시오(철자 수정됨).

s/System Administrator/Desktop User/
N
s/System\nAdministrator/Desktop\nUser/

그러면 현재 줄의 문자열이 변경되고, 다음 줄을 읽고, 중간에 개행 문자가 포함된 문자열이 변경됩니다. 문자열의 전체 복사본으로 홀수 줄을 변경하지 않습니다.(또는 홀수 행만 System).


GNU 사용 sed:

:top
N
$s/System\(.\)Administrator/Desktop\1User/g
b top

스크립트는 파일의 모든 행을 반복하여 패턴 공간으로 읽습니다. 입력의 마지막 줄에 도달하면 두 단어 사이에 모든 문자를 허용하면서 전역적으로 교체를 수행합니다( 대신 \([ \n]\))를 사용할 수도 있습니다 \(.\).

결과는 다음과 같습니다

The first meeting of the Linux Desktop
User's group will be held on Tuesday.
Another line
And here we have: Desktop User's Group as well.
1.Desktop User's group.
2.Desktop Users Group.
3.Desktop Users Group.
The first meeting of the Linux Desktop
User's group will be held on Tuesday.
Desktop Users Group.

답변2

두 줄에 걸쳐 있는 패턴을 검색할 때 N및 - a와 함께 사용됩니다.PDN;P;D cycle이므로 패턴 공간 1 에는 항상 두 개의 행이 있습니다 .

sed '$!N
s/System\nAdministrator/Desktop\nUser/
s/System Administrator/Desktop User/g
P
D' <infile

이는 구문 s/System\nAdministrator/Desktop\nUser/입니다 gnu sed. 당신이 할 휴대용

s/System\nAdministrator/Desktop\
User/

1: 라인 1-2에서 시작하고, P;D 이후 라인 2-3을 처리한 다음 라인 3-4 등을 처리합니다.

관련 정보