sed를 사용하는 정규식 및 파이프 명령

sed를 사용하는 정규식 및 파이프 명령

명령을 사용하기가 정말 어렵고 sed잘 작성된 튜토리얼도 찾을 수 없는 것 같습니다.

제가 다른 언어(Python, JavaScript, Java)에서 정규식을 사용해 본 적이 있다고 가정해 보겠습니다.해서는 안 된다문제가 된다.

따라서 내 질문은 다음과 같습니다("이론적인" 질문과 보다 실용적인 질문).

  1. 정규식은 sedPython/JS/Java에서 사용되는 정규식과 정확히 동일합니까? BRE와 ERE에 대해 읽었는데 어떻게 다른가요? ERE는 안된다확장하다갈아 바수다?

  2. 예를 들어 파이프 출력에서 ​​무언가를 추출하려는 경우 sed이를 수행하는 구문은 무엇입니까?

uptime두 번째 질문에 대한 추가 정보: sed의 파이프 출력이 있다고 가정해 보겠습니다.

uptime | sed ...

uptime다음 예제 출력이 주어지면 18:13 up 5:12, 2 users, load averages: 0,45 0,37 0,40두 개의 별도 숫자(시간 및 분) 형식으로 단일 가동 시간을 구문 분석한 다음 이를 xxhyym시간 xx, yy분) 형식으로 표시하려고 합니다.

마지막으로 Python에서 다음을 수행합니다.

hh, mm = re.match(r'\s+ up \s+(\d{1,2}):(\d{1,2})').groups()
print '%sh%sm' % (hh, mm)

답변1

기존 UNIX 도구는 BRE 또는 ERE(기본 또는 확장 정규식)를 지원합니다. POSIX는 둘 다 인코딩합니다.위키피디아그들은 설명했다. 대부분의 최신 도구는 일반적으로 Perl에서 처음 도입된 추가 기능(이라고 함)을 사용하여 ERE를 확장합니다.폴리 메라 제 연쇠 반응).

ERE는 BRE의 기능을 확장하지만 구문은 확장하지 않습니다. BRE에서는 문자에만 \[.*^$특별한 의미가 있으며 일부 연산자(예: 그룹화)는 \(…\)백슬래시를 사용합니다. ERE에서는 +?|()그것도 특별하며 백슬래시 뒤에 영숫자가 아닌 문자가 오는 것은 결코 특별하지 않습니다.

\dBRE에는 Python/PCRE 및 가 없습니다 . 기존 컬렉션 구조와 문자 클래스를 사용하여 is 및 is \s문자 세트를 나타낼 수 있습니다 . 이중 괄호에 주의하세요. 하나는 문자 세트를 나타내고 다른 하나는 문자 클래스를 나타냅니다. 예를 들어 "문자, 대시 또는 밑줄"을 쓸 수 있습니다 .\d[[:digit:]]\s[[:space:]][-_[:alpha:]]

BRE에는 연산자 가 없습니다 ( BRE 구문의 확장으로 +일부 sed 구현에서 지원됨 ) . 그룹 및 일치 수에는 추가 백슬래시가 필요합니다.\+X+XX*

따라서 BRE에 해당하는 Python은 공백이 너무 \s+ up \s+(\d{1,2}):(\d{1,2})많습니다 [[:space:]][[:space:]]* up [[:space:]][[:space:]]*\([[:digit:]]\{1,2\}\):\([[:digit:]]\{1,2\}\). \s+공백은 최소 두 개의 공백 문자를 의미합니다.

ssed의 명령이 행을 다시 작성하므로 전체 행을 일치시켜야 합니다 . 저장된 그룹에서 조합된 문자열을 작성하는 별도의 명령은 없습니다. 추가 공백을 수정하면 Python 코드 조각의 시뮬레이션은 다음과 같습니다.

uptime | sed 's/^.*[[:space:]][[:space:]]*up[[:space:]][[:space:]]*\([[:digit:]]\{1,2\}\):\([[:digit:]]\{1,2\}\).*$/\1h\2m/'

Python 코드 조각과 달리 이는 마지막 일치 항목이 아닌 첫 번째 일치 항목을 추출하지만 여기서는 중요하지 않습니다.

출력에는 uptime공백 문자와 ASCII 숫자가 필요하므로 정규식을 단순화할 수 있습니다.

uptime | sed 's/^.* up  *\([0-9]\{1,2\}\):\([0-9]\{1,2\}\).*$/\1h\2m/'

uptime이는 머신이 1일 미만 동안 실행된 출력과만 일치합니다. 연습일로 매칭일을 남겨두겠습니다. (팁: 두 가지 표현식을 작성하세요 sed -e s/AS ABOVE/\1h\2m/ -e 's/EXERCISE/\1d\2h\3m/':)

답변2

각 도구는 (대부분) 자체 RE 라이브러리를 사용합니다. 다른 버전에서도 sed여기서 차이점을 찾을 수 있습니다. 널리 사용되는 두 가지 표준은 많은 도구에서 허용되는 POSIX 표준 정규식(적어도 몇 가지 옵션 포함)이고 또 다른 인기 있는 표준은 PCRE(Perl Compatible Regular Expression Library)입니다. 하지만 마지막은 "일반" RE와는 매우 다릅니다...

귀하의 경우:

uptime | sed -e 's/^ \([0-9][0-9]\):\([0-9][0-9]\).*$/\1h\2m/'

(Fedora 18, sed-4.2.1-10.fc18.x86_64, GNU sed에서 시도했습니다).

고쳐 쓰다:문서의 양이 많으면 무엇이 문제인가요?GNU sed의 홈페이지? 아니면 이거지도 시간? GNU의 정보 문서는 sed다소 길지만 완전합니다.

관련 정보