C/C++ 파일 종속성 그래프 생성 결과를 수정하고 싶습니다 sed
.gcc -MM
입력은 다음과 같습니다.
ThreadCrash.o : ThreadCrash.cpp ThreadCrash.h hdr1.h \
../inc/hdr2.h ../inc/hdr3.h \
../inc/hdr4.h ../inc/hdr4.h
다음과 같이 표시되어야 합니다.
ThreadCrash.o : \
ThreadCrash.cpp \
ThreadCrash.h \
hdr1.h \
../inc/hdr2.h \
../inc/hdr3.h \
../inc/hdr4.h \
../inc/hdr4.h
대체의 "찾기" 부분에 대해 캡처 그룹을 "반복"하려고 시도했지만 (.*)*
대체 문자열을 구성하는 방법을 알 수 없습니다.
나는 sed에 의존하지 않으므로 awk
등과 같은 간단한 방법을 사용하면 크게 감사하겠습니다.
감사해요!
답변1
모든 UNIX 시스템의 모든 쉘에서 awk를 사용하십시오.
$ cat tst.awk
BEGIN { RS="" }
{
gsub(/\\/,"")
printf "%s ", $1
for (i=2; i<NF; i++) {
printf "%s \\\n", $i
}
print $NF
}
$ awk -f tst.awk file
ThreadCrash.o : \
ThreadCrash.cpp \
ThreadCrash.h \
hdr1.h \
../inc/hdr2.h \
../inc/hdr3.h \
../inc/hdr4.h \
../inc/hdr4.h
답변2
줄 시작 부분의 공백을 제거한 다음 콜론이나 백슬래시를 제외한 모든 공백을 space-backslash-newline-char 시퀀스로 바꿉니다.
GNU sed 사용:
sed -E 's/^ //; s/ ([^:\\])/ \\\n\1/g'
답변3
이것이 직관에 어긋나는 것처럼 보일 수 있지만 실제로 가장 간단한 접근 방식은 종속성을 다시 한 줄로 연결한 다음(연속을 다시 연결하여) 가로 공백 시퀀스를 일치시켜(선택적 콜론 사용) 이를 다시 분리하는 것입니다.
그래서 주어진
$ cat input
ThreadCrash.o : ThreadCrash.cpp ThreadCrash.h hdr1.h \
../inc/hdr2.h ../inc/hdr3.h \
../inc/hdr4.h ../inc/hdr4.h
그 다음에
$ sed -e :a -e '/\\$/N; s/\\\n//; ta' input
ThreadCrash.o : ThreadCrash.cpp ThreadCrash.h hdr1.h ../inc/hdr2.h ../inc/hdr3.h ../inc/hdr4.h ../inc/hdr4.h
마침내
$ sed -e :a -e '/\\$/N; s/\\\n//; ta' input | sed -r 's/[[:blank:]]+(: )?/ \1\\\n/g'
ThreadCrash.o : \
ThreadCrash.cpp \
ThreadCrash.h \
hdr1.h \
../inc/hdr2.h \
../inc/hdr3.h \
../inc/hdr4.h \
../inc/hdr4.h
gcc -MM
처음에 행 간 분할을 방지하는 방법을 알아낼 수 있다면 첫 번째 단계를 피할 수 있습니다.
인용하다:
- Sed 한 줄 설명, 1부: 파일 간격, 번호 매기기, 텍스트 변환 및 교체,39. 줄이 백슬래시 "\"로 끝나면 다음 줄에 추가합니다.