일치하는 특정 단어 앞에 오는 단어를 추출하여 인쇄하려고 합니다. 예를 들어,
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
sed
grep
복잡한 대체를 사용하는 대신 고정 문자열 검색을 사용할 수 있습니다 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
이 줄에서 작동하지 않는 경우).
q
sed
은 (점프하지 않고) 이미 단어를 찾았고 T
새 단어를 찾을 필요가 없기 때문에 실행을 중지하는 명령입니다 .
업데이트: GNU 확장이 없는 솔루션
sed -n 's/\(^\|\(.* \)\)\([^ ]*\) YOUR_WORD\(\( .*\)\|$\)/\3/; tprint; b; :print; p; q
해석은 동일하며 백슬래시와 t
. 교체하면 점프 t
하지만T
예전에는성공적인. 그렇다면 "인쇄 및 종료"로 이동하고, 그렇지 않은 경우 b
스크립트와 다음 처리 라인으로 보냅니다.