sed의 정규 표현식은 PCRE에서처럼 작동하지 않습니다.

sed의 정규 표현식은 PCRE에서처럼 작동하지 않습니다.

이 소스 file.c가 있습니다.

#include <dir/header1>
#include <dir/header2>
#include <dir/header3>
...

나는 dir 뒤의 헤더만 일치시키고 싶습니다(예 header1: ). 나는 이렇게 한다:

$ sed -En 's/\/(.*)>/\1/p' file.c

그러나 다음과 같이 출력됩니다.

#include <dirheader1/이므로 줄의 시작 부분부터 일치하지만 문자별로 그룹화하고 싶습니다 (따라서 s/\/...). 그래서 나는 다음을 시도했습니다.

$ sed -En 's/<.*\/(.*)>/\1/p' file.c

이 중 어느 것도 도움이 되지 않습니다. 그렇다면 그것을 달성하는 방법은 무엇입니까?

답변1

headerx명령을 사용하여 표시된 세 줄의 비트 만 추출하려면 다음을 수행해야 합니다.s///sed제거하다원하지 않는 라인의 모든 비트.

필요하지 않은 줄의 비트는 #include <dir/시작 부분의 초기 문자열과 >끝 부분의 마지막 문자열입니다. 이는 모두 정규식과 일치해야 합니다. 그런 다음 캡처 그룹을 사용하여 초기 문자열과 최종 문자열 사이의 비트를 바꿉니다.전선캡처된 문자열로:

sed -n 's,.*/\(.*\)>,\1,p' file.c

또는 더 구체적으로 말하자면,

sed -n 's,^#include <dir/\(.*\)>,\1,p' file.c

답변2

경기의 첫 번째 부분을 포기하지 않으므로 코드를 수정하여 그렇게 할 수 있습니다. @kusalananada에 따르면

또는 부정적인 패턴으로 범용 일치를 사용하십시오.

sed -En "s|[^/]+/([^>]+)>|\1|p" file

특정 경기에 대해#include

sed -En "s|^#include <dir/([^>]+)>|\1|p" file

아니면 grep당신이

grep -Po "(?<=#include <dir/)[^>]+" file

또는gawk

awk -F"/|>" '$1~include{print $(NF-1)}' file

관련 정보