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"
.이렇게 하면 선이 반전됩니다.