이 소스 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