sed를 사용하여 일치하는 단어 앞의 단어를 반환합니다.

sed를 사용하여 일치하는 단어 앞의 단어를 반환합니다.

일치하는 특정 단어 앞에 오는 단어를 추출하여 인쇄하려고 합니다. 예를 들어,

There are 12 processes running.

processes여기서는 인쇄하고 싶은 단어를 검색하기 위해 sed를 사용하고 있습니다 12.

이것을 사용할 수 있습니까 sed?

답변1

이 줄만 처리해야 하는 경우 sed 명령을 사용할 수 있습니다.

sed -e 's/.* \([[:digit:]]\{1,\}\) processes running\./\1/'

약간 더 강력한 접근 방식을 위해 다음 스크립트는 임의의 입력을 허용하고 일치하는 경우에만 응답합니다.

sed -ne 's/.* \([[:digit:]]\{1,\}\) processes running\./\1/p'

답변2

sedgrep복잡한 대체를 사용하는 대신 고정 문자열 검색을 사용할 수 있습니다 cut.

$ grep -F 'processes' file | cut -d ' ' -f 3

답변3

내가 아는 한, (일반적인 경우) 아무 단어나 찾아서 그 앞에 있는 단어를 인쇄하면 됩니다.

해결책 GNU sed:

sed -rn 's/(^|(.* ))([^ ]*) YOUR_WORD(( .*)|$)/\3/; T; p; q' 

설명하다

-r확장된 GNU 정규 표현식입니다.

-n인쇄하지 말라는 명령입니다.

(^|(.* ))— 인쇄하려는 단어 앞에 접두어를 추가합니다. 줄의 시작( ^) 또는 ( |) 공백 종료 문자( (.* ))일 수 있습니다.

([^ ])*)—인쇄될 단어( \3);

YOUR_WORD— 찾은 단어 뒤의 단어를 바꿉니다. ("프로세스" 다음에 "실행"하는 것과 같습니다);

(( .*)|$)$— 공백 및 일부 문자 뒤의 단어, 종결자( ) 또는 줄 종결자;

\3단어 찾기;

T"교체에 실패하면 끝으로 점프", GNU 확장입니다. YOUR_WORD첫 번째 단어가 아닌 단어를 제외하고 스크립트의 각 줄 끝으로 이동합니다 .

p찾은 단어를 인쇄하는 "인쇄 버퍼"입니다( T이 줄에서 작동하지 않는 경우).

qsed은 (점프하지 않고) 이미 단어를 찾았고 T새 단어를 찾을 필요가 없기 때문에 실행을 중지하는 명령입니다 .

업데이트: GNU 확장이 없는 솔루션

sed -n 's/\(^\|\(.* \)\)\([^ ]*\) YOUR_WORD\(\( .*\)\|$\)/\3/; tprint; b; :print; p; q

해석은 동일하며 백슬래시와 t. 교체하면 점프 t하지만T예전에는성공적인. 그렇다면 "인쇄 및 종료"로 이동하고, 그렇지 않은 경우 b스크립트와 다음 처리 라인으로 보냅니다.

관련 정보