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行の説明、パート1:ファイル間隔、番号付け、テキスト変換および置換、39. 行がバックスラッシュ「\」で終わったら、次の行に追加します。