sed - 각 필드의 기능을 난독화합니다.

sed - 각 필드의 기능을 난독화합니다.

저는 UNIX(bash)를 처음 접했고 이 언어를 익히려고 노력해 왔습니다. 현재 .txt 파일에서 고정 헤더가 있는 테이블을 만들려고 합니다.

그래서 다음과 같은 코드를 발견했습니다.

column -t -s : <(echo Name:Age:Gender:Height:Weight) test.txt | sed "1{p;s/./*/g}"

sed마지막에 명령 부분이 완전히 혼란 스럽습니다. 나는 모든 것을 대체할 ./*/g수 있는 수단 sed과 전 세계적으로 일어날 수 있는 수단을 알고 있습니다..*/g

그러나 the 1와 the는 p;s실제로 무엇을 의미합니까?

답변1

이것은 매우 영리한 코드입니다.

sed,이 훌륭한 튜토리얼에서 배울 수 있듯이, 적용 가능주소그리고주문하다. 주소를 생략하면 common 과 같이 각 줄에서 명령이 실행됩니다 s/old/new/.

주소는 줄 번호 또는 정규식일 수 있습니다. 또는 쉼표로 구분된 주소 범위일 수도 있습니다. 이에 대해서는 더 이상 설명하지 않겠습니다. (자세한 내용은 위에 링크된 튜토리얼을 참조하세요.)

명령은 단일 명령일 수도 있고 중괄호로 묶인 여러 명령일 수도 있습니다.

이 sed 명령은 print 명령을 실행합니다.그런 다음s1행에 대체 명령을 입력합니다. 결과적으로 input 의 첫 번째 줄 뒤에 동일한 길이의 문자열이 나타납니다 ***.

s명령 뒤에는 rint 명령이 나오지 않지만 , 해당 옵션이 sed에 먼저 전달되지 p않는 한 각 줄의 끝에서 "패턴 공간"에 있는 모든 내용이 암시적으로 인쇄됩니다 . -n(자세한 내용은 위에 링크된 튜토리얼을 참조하세요.)


본질적으로 이는 테이블에 아름다운 제목을 만드는 빠른 방법입니다.


댓글에 답변하려면 다음을 수정하세요.

따라서 이 p명령은 1sed 시작 부분 어디에나 배치할 수 있습니다 or at the end? Also, the. `(마침표)는 주소가 생략되었다는 뜻인가요?

아니요, 정확히는 아닙니다.

1, 다음 명령 목록(중괄호로 묶임)은 입력의 첫 번째 줄에만 적용됩니다.

이것이 p의미하는 바는 패턴 공간의 현재 내용과 개행 문자를 인쇄한다는 것입니다. (이 시점에서 패턴 공간에는 입력의 첫 번째 줄이 포함됩니다. 이것이 Sed의 작동 방식이기 때문입니다.)

이는 정규식 (모든 문자와 일치)의 모든 일치(전역) s/./*/g에 대해 문자가 대체됨을 의미합니다 . 이는 패턴 공간에서 작동합니다.g.*

그런 다음 명령 끝(닫는 중괄호)에서 더 이상 명령이 없으므로 패턴 공간의 내용이 암시적으로 인쇄됩니다. 이 시점에는 별표( ***)만 포함되어 있습니다.

그런 다음 입력의 다음 줄을 패턴 공간으로 읽어옵니다. 주소가 1일치하지 않기 때문에 중괄호 명령 블록을 건너뜁니다. 중괄호 블록 끝에는 더 이상 명령이 없으므로 패턴 공간의 내용이 암시적으로 인쇄됩니다. 입력이 있는 한 이 섹션을 반복합니다. 따라서 결과는 첫 번째 줄 이후의 나머지 입력이 변경되지 않고 인쇄되는 것입니다.

따라서 출력에는 입력의 모든 줄과 문자로만 구성되고 첫 번째 줄 *과 길이가 같은 첫 번째 줄 뒤의 줄이 포함됩니다.

답변2

*sed 스크립트는 입력의 첫 번째 줄을 인쇄한 다음 첫 번째 줄과 정확히 같은 너비의 문자 줄을 인쇄합니다.

1{p;s/./*/g}
  • 1입력의 첫 번째 줄에만 일치하는 주소입니다. 즉, 블록 sed의 명령은 {}첫 번째 줄에만 적용됩니다.
  • p- 입력 내용을 변경하지 않고 인쇄
  • ;명령 구분 기호입니다. 이 경우 p명령과 s/./*/g명령을 구분합니다.
  • s/./*/g- 각 문자를 a로 변경 *하고 결과를 인쇄합니다.

sed나머지 입력(라인 2+)이 있는 경우( -n해당 옵션 없이 사용된 경우) 기본 동작에 따라

전체 명령은 다음과 같습니다.

column -t -s : <(echo Name:Age:Gender:Height:Weight) test.txt | sed "1{p;s/./*/g}"

column -t -s :에코 문자열 및 "Name:Age:Gender:Height:Weight"의 내용으로 구성된 입력을 구성하는 데 사용됩니다 file.txt. column출력은 파이프로 연결되어 seds 라인을 생성하고 ******헤더를 나머지 출력과 분리합니다.

관련 정보