sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
...인쇄물...
2015-01 6000
2015-02 8000
2015-03 10000
그래서이 선언 상기 정규식 정의 필드 범위 (A)의 구성되어 *
가변 길이 문자가 하나의 시퀀스 ^
생략 <공간> a로 바로 다음 *
가변 길이 문자가 하나의 시퀀스 <공간> . 이 선언은 sed
의 패턴 공간에 적용됩니다.이 공간 은 입력시 발생 하는 각 ewline 문자 에 의해 기본적으로 구분되는 문자열 이며 동일한 각 발생에 대해 다음 으로\n
재귀 적으로 대체됩니다 (기본적으로) .
이 선언에 대한 인터페이스는 두 가지이며 각 수준 에서 명령 구문의 예측 가능한 적용을 보장하기 위해 하나 이상의 국제 IEEE 공식 표준위원회 에 의해 완전히 규제되고 지정됩니다 sed
. 예를 들어,이 경우 sed
API 명령 은 /
address /
명령 (항상 sed s///
ubstitution 명령 의 첫 번째 구성 요소 ) 과 함께 적용되지만 내용은 기본 API에 대해 지정된 서브 세트로 더 기본 API에 의해 해석됩니다. 표준 C 라이브러리의regcomp()
함수 .
나는 때문에, 자신이 진술을 할 수 sed
있습니다 하지 오히려이 실행 파일 이름이 컴파일 된, 단지 프로그램,하지만 sed
내 유닉스와 같은 기계는이다 구현 역사적으로 설립, 잘 정의의, 그리고 표준 제어 sed
응용 프로그램 내 시스템의 regular-의를 식 일치 라이브러리.
로부터 sed
사양 :
이 sed
유틸리티는 XBD 기본 정규식에 설명 된 BRE를 지원해야합니다 ...
... 우리가 찾는 곳 ...
BREs 및 ERES 모두에서 POSIX.1-2008의 시스템 인터페이스 볼륨에서 정규 표현식 매칭 인터페이스를 지원하는 regcomp()
, regexec()
및 관련 기능.
호출하는 응용 프로그램 regcomp()
은 패턴 문자열을 표시하고 ...
... 그 regcomp()
함수는 패턴 인수가 가리키는 문자열에 포함 된 정규 표현식을 컴파일 하고 결과를 구조 preg 에 배치해야합니다 .
그에 따라, 상기 응용 프로그램은 regcomp()
의 동반자 기능 을 참조 할 것입니다 ...
... [t] 그 regexec()
함수에 의해 지정된 널 종료 문자열 비교 문자열 컴파일 된 정규식과 레그 에 대한 이전 호출을 초기화 regcomp()
...
... 패턴 의 괄호로 묶인 하위 표현식 에 해당하는 문자열regexec()
하위 문자열의 오프셋으로 [an] 배열의 요소를 채 웁니다 ... 패턴 자체는 하위 표현식으로 계산됩니다 ...\(
\)
... 그는 [t] regexec()
모두 기입해야 작동 nmatch를 요소 pmatch , nmatch를 하고 pmatch 어떤 요소도, 애플리케이션에 의해 제공되는 pmatch는 에 대응 표현식을하지 않는 패턴 .
그리고 내가 할 때 ...
/[^ ]* */
... sed
먼저 정규 표현식을 컴파일 하고 결과를 메모리에 저장 한 다음, 저장된 명령을 자동으로 적용하여 패턴 공간의 내용에 명령을 수행하는 데 필요한 횟수만큼 적용합니다. 결과는로 반환되는 오프셋에서 구분 된 하나 이상의 null로 구분 된 필드 의 배열입니다 regexec()
.
그리고 내가 할 때 ...
//
...는 가장 최근에 정의 된 정규 표현식을 사용할 필요가 있음을 나타냅니다 sed
만 호출 할 수 있습니다 regexec()
다시 미리 컴파일 된 정규 표현식을 재사용, 그러나 가능하게 변경된에이 시간을 적용 문자열 인수하거나 새로운 적용 nmatch를 내가 명령으로 매개 변수를.
더 구체적으로 ...
s/[^ ]* */[&]P/
- 패턴 공간에서 처음 나타나는 패턴 을
[
왼쪽 대괄호, 그 &
다음에 ]
오른쪽 대괄호 뒤에 P
문자로 바꿉니다.
s//&+pc/3
- 현재 패턴 영역 다시 마지막으로 사용 된 정규식을 적용하고, 대체
3
제 3 발생 패턴 과 패턴 영역에 &
자체 첨부 문자열 하였다 +pc
.
따라서 sed
입력 데이터의 각 줄에 대해 예제 데이터가 주어지면 stdout에 씁니다.
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
이것은 이상하게 보일지 모르지만 dc
계산기는 대괄호 사이의 입력에서 문자열 을 인용 하며 P
명령은 \n
ewline 을 추가하지 않고 스택 상단을 인쇄 하고 나중에 입력 스택에서 팝을 팝합니다.
따라서 첫 번째 줄을 예로 사용하면 다음과 같이 dc
됩니다.
[2015-01 ]P
5000
- 숫자
5000
를 스택 상단으로 밀고 현재 스택에있는 모든 요소 (현재 없음) 를 1 씩 내립니다.
1000
- 그러나 이번에는 주 스택 상단의 숫자 5000이 1 씩 내려 가고 스택의 두 번째 요소가됩니다.
+
- 스택에 맨 위 두 숫자를 더하고 스택에서 두 숫자를 모두 빼고 합계를 스택 맨 위로 밉니다.
- 그 결과 숫자만으로 구성된 스택이 만들어집니다
6000
.
- 스택의 최상위 두 요소 중 하나가
[
문자열 인 경우 구문 오류 ]
입니다.
p
p
스택 상단에서 \n
튀어 나오지 않고 스택 상단을 찢고 추가 된 ewline을 붙 입니다.
c