Bash에서 egrep [[:print:]] 명령의 용도는 무엇입니까?

Bash에서 egrep [[:print:]] 명령의 용도는 무엇입니까?

파일을 읽고 처리할 수 있는 셸 스크립트에 대한 향상된 기능을 개발 중입니다. 기본적으로 입력 파일에는 헤더 레코드와 일부 세부 레코드가 포함됩니다. 파일에서 헤더 레코드를 가져오고 싶습니다.

$ cat sample_file.txt
header1,header2,header3,header4
value1,value2,value3,value4

기존 스크립트는 다음 명령을 사용하여 파일에서 헤더를 가져옵니다.

$ cat sample_file.txt | head -1 | egrep -o '[[:print:]]' |  tr '\n' '\0'
header1,header2,header3,header4$

egrep -o '[[:print:]]'여기서 무엇을 해야할지 모르겠습니다 . 명령어가 없더라도 egrep이렇게 입력하면 되니까

제목을 그대로 인쇄하세요.

$ cat sample_file.txt | head -1
header1,header2,header3,header4

또는 끝에 개행 없이 제목을 인쇄합니다.

$ cat sample_file.txt | head -1 |  tr '\n' '\0'
header1,header2,header3,header4$

매뉴얼 페이지에는 다음 내용이 나와 있지만 언제 사용해야 하는지는 egrep확실하지 않습니다 .[[:print:]]

마지막으로 아래와 같이 특정 명명된 문자 클래스가 대괄호 표현식 내에 미리 정의되어 있습니다. 해당 이름은 설명이 필요 없으며 [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:]입니다. , [:punct:], [:space:], [:upper:] 및 [:xdigit:]. 예를 들어, [[:alnum:]]은 [0-9A-Za-z]를 의미하지만 후자 형식은 C 로캘 및 ASCII 문자 인코딩에 따라 달라지지만 전자는 로캘 및 문자 집합에 독립적입니다. (이러한 클래스 이름의 대괄호는 기호 이름의 일부이므로 대괄호 목록을 구분하는 대괄호와 함께 포함되어야 합니다.) 대부분의 메타 문자는 목록에서 특별한 의미를 잃습니다. 텍스트]를 포함하려면 목록에 먼저 넣으세요. 마찬가지로 리터럴 ^를 포함하려면 시작 부분을 제외한 아무 곳에나 배치하세요. 마지막으로 텍스트를 포함하려면 마지막에 넣으세요.

egrep '[[:print:]]'옵션의 사용법과 사용처를 이해하는 데 도움을 주실 수 있나요 ?

답변1

대괄호 표현식은 유사 [abc]하며 문자 중 하나와 일치합니다. 예를 들어 or [abc]와 일치 하지만 or 와 일치하지 않습니다 . 대괄호 표현식 내의 문자 클래스를 사용하여 대괄호 표현식과 일치하는 집합에 전체 클래스를 추가할 수 있습니다. 제어 문자, 줄 바꿈 및 탭을 유지하면서 인쇄 가능한 단일 문자와 일치합니다. , 또는 더 나은 방법은 주어진 패턴과 일치하는 모든 행을 인쇄하고 다음을 사용하여 일치하는 부분만 인쇄합니다.abd:[[:print:]]egrepgrep -E-o한 줄에 하나씩.

예를 들어 다음을 사용할 때 [:alpha:]콜론은 생략됩니다 .

$ echo ab:c | egrep -o '[[:alpha:]]'
a
b
c

따라서 실제로 egrep -o '[[:print:]]'입력에서 인쇄 가능한 모든 문자는 한 줄에 하나씩 인쇄됩니다. 그런 다음 tr '\n' '\0'개행 문자를 NUL 바이트로 변경하여 그 사이에 NUL이 포함된 인쇄 가능한 모든 문자를 얻습니다. NUL은 제어 문자보다 처리하기가 쉽지 않기 때문에 이것이 의미가 있는지 확실하지 않습니다. less예를 들어 또는 에서 결과 데이터를 열면 NUL 이 컬러로 vim인쇄된 것을 볼 수 있습니다 .^@

다시 말하지만, cat sample_file.txt | head -1 | tr '\n' '\0'아니오제거하다개행 문자는 NUL로 대체됩니다.


여기에 목표가 무엇인지 잘 모르겠지만 개행 문자와 탭을 제거하려면 다음을 사용할 수 있습니다 tr -d.

... | tr -d '\n\t'

일치하는 문자 세트를 보완(역전) -d하려면 인쇄할 수 없는 문자를 모두 제거하세요 .-c

... | tr -dc '[:print:]'

( tr정규식처럼 외부 괄호를 사용하지 않는다는 점에 유의하세요. 실제로 to에 대한 인수는 tr정규식 괄호 표현식의 내부 부분과 같습니다.)

답변2

설명은 다음에서 찾을 수 있습니다.GNU 문자 클래스 및 대괄호 표현식문서:

'[:print:]'
인쇄 가능한 문자: '[:alnum:]', '[:punct:]' 및 공백.


전체 헤더가 필요한 경우 egrep등과 같은 구문 분석 명령이 필요하지 않습니다.


에서 man egrep:

또한 변형 프로그램 egrep, fgrep 및 rgrep은 각각 grep -E, grep -F 및 grep -r과 동일합니다. 이러한 변형은 더 이상 사용되지 않지만 이전 버전과의 호환성을 위해 제공됩니다.

따라서 기본적으로 egrep [[:print:]]와 동일합니다 grep -E [[:print:]]. 필요한 경우에만확장 정규식(ERE), 하지만 이 모델은 [[:print:]]그중 하나가 아닙니다.

관련 정보