sed에서 줄을 바꾸시겠습니까?

sed에서 줄을 바꾸시겠습니까?
 echo 1234 |   sed '
       /\n/ !G
       s/\(.\)\(.*\n\)/&\2\1/
       //D
       s/.//
     ' 

위의 코드를 이해할 수 없습니다 sed.

내 이해는 다음과 같습니다

PATTERN SPACE=1234
first operation /\n/ !G ---> 1234\n(if \n is  not found it is appended at th end)
                s/\(.\)\(.*\n\)/&\2\1/ ----> 1234\n234\n1
                //D ----> \n234\n1(deletes upto newline and commands
                                   from the beginning are applied to the 
                                   existing pattern space)
PATTERN SPACE=\n234\n1
second operation /\n/ !G ---> skipped since  \n234\n1 has newline now
                 s/\(.\)\(.*\n\)/&\2\1/ ----> \n234\n1234\n
                 //D ----> \n234\n1234\n

내가 뭔가 잘못한 것 같습니다.

답변1

이 코드에는 루프가 있어 혼란스러워 보입니다. 이 지점에서:

   s/\(.\)\(.*\n\)/&\2\1/
   //D

계속 반복하면서 캐릭터가 남을 때까지 캐릭터를 이동한 234\n1다음 루프를 종료합니다.34\n21\n4321

catonmat의 설명이 정확하므로 여기에 입력하겠습니다.37. 줄을 반대로 바꿉니다("rev" Unix 명령을 에뮬레이트합니다)..

발췌

개행 문자가 없으면 첫 번째 줄의 "/\n/ !G"패턴 공간 끝에 개행 문자가 추가됩니다.

두 번째 줄은 첫 번째 문자를 로 그룹화 하고 다른 모든 문자를 로 그룹화하는 "s/\(.\)\(.*\n\)/&\2\1/"간단한 표현식입니다 . 그런 다음 일치하는 전체 문자열을 로 바꿉니다 . 여기서 는 일치하는 전체 텍스트( )입니다. 예를 들어 입력 문자열이 "1234"인 경우 표현식 뒤에 오는 내용은 가 됩니다 .s///\1\2"&\2\1""&""\1\2"s///"1234\n234\n1"

세 번째 줄은 입니다 "//D". 이 문장이 이 문장의 핵심입니다. 빈 패턴은 //마지막 기존 정규식과 일치하므로 다음과 정확히 동일합니다 /\(.\)\(.*\n\)/D. "D" 명령은 입력 시작 부분부터 첫 번째 개행 문자까지 삭제한 다음 스크립트의 첫 번째 명령을 사용하여 편집을 다시 시작합니다. 루프를 생성합니다. /\(.\)\(.*\n\)/만족하는 한 sed는 이전의 모든 작업을 재개합니다. 몇 번의 루프 후에 패턴 공간의 텍스트는 가 됩니다 "\n4321". 그런 다음 /\(.\)\(.*\n\)/실패하고 sed는 다음 명령으로 이동합니다.

네 번째 줄은 "s/.//"패턴 공간에서 개행 문자인 첫 번째 문자를 제거합니다. 패턴 공간의 내용은 "4321"- 의 반전이 됩니다 "1234".

이렇게 하면 선이 반전됩니다.

관련 정보