여러 그룹 캡처/수정을 위해 sed 사용

여러 그룹 캡처/수정을 위해 sed 사용

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처음에 행 간 분할을 방지하는 방법을 알아낼 수 있다면 첫 번째 단계를 피할 수 있습니다.

인용하다:

관련 정보