複数グループのキャプチャ/修正にsedを使用する

複数グループのキャプチャ/修正にsedを使用する

C / C ++ファイルの依存関係グラフの生成結果を修正したいと思いますsedgcc -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最初に行間の分割を防ぐ方法を理解できる場合は、最初のステップを回避できます。

引用:

関連情報