2017-11-07 23 views
1

ディレクトリにある.cファイルをリストするmakefile(Makefile.inc)があります。Bash:ファイルの特定部分をbashで更新する

#                                             
# Makefile.inc                                 
#                                               

.. 
unknown number of lines 
..                                        

LIB_FOO_BAR_SRCS = \                                        
    a.c \                                           
    f.c \                                          
    k.c \                                           
    m.c \                                            
    z.c   
.. 
unknown number of lines 
.. 

私は実行するたびに新しい.cファイルでMakefile.incを更新する短いスクリプトを書きたいと思っています。スクリプトへの入力は、ソースとMakefile.incの場所になります。

例:

#                                             
# Makefile.inc                                 
#                                               

.. 
unknown number of lines 
..                                       

LIB_FOO_BAR_SRCS = \                                        
    a.c \ 
    b.c \                                           
    f.c \                                          
    k.c \                                           
    m.c \ 
    s.c \                                            
    z.c   

.. 
unknown number of lines 
.. 

いくつかの条件:

ソースディレクトリにSCおよびBCを添加し、スクリプトを実行した後、Makefile.incは下記いずれかに上記一方から更新されるべきです
  1. Makefile.incの.cファイルのリストはソートする必要があります。
  2. LIB_FOO_BAR_SRCSの行番号は不明です。しかし、変数LIB_FOO_BAR_SRCSは間違いなく "LIB_"で始まり、 "_SRCS"で終わります。
  3. 私は膨大な数のMakefileにこれを使用する予定であるので、スクリプトは汎用的でなければなりません。

私は_SRCSのgrepの方法を考え出し、行番号を取得しました。 私はまた、追加するリストをフォーマットしました。

#!/bin/bash                                            
TAB=$'\t'                                             

MAKEFILE_PATH="PATH/TO/Makefile.inc"            
SRC_PATH="PATH/TO/FOO_BAR/SRC"                

Line=$(grep -n -m 1 "SRCS" $MAKEFILE_PATH | cut -f1 -d: | sort)                                
echo $Line                                            

list_src=$(ls -p "$SRC_PATH"/*.c | xargs -n1 basename | sed "s/^/${TAB}/" | sed 's/$/ \\/' | sed '$ s/.$//') 
echo $list_src 

出力:

15 
     a.c \ 
     b.c \                                           
     f.c \                                          
     k.c \                                           
     m.c \ 
     s.c \                                            
     z.c 

さて、難しい部分。行番号$ Lineの後に既存のリストを削除して新しいリスト($ list_src)を追加するには?

答えて

0

awkレスキュー!

$ awk -v nl="${newlist}" '!f; $1~/^LIB_.*_SRCS$/{f=1; print nl} !NF{f=0}' file 

は、与えられた引数で空の行にパターンLIB_.*_SRCS間に線を置き換えます。

+0

動作していますが、問題があります。ファイル名は1行で表示されます(スペース区切り)。元のファイルのように新しい行に表示する方法は? –

関連する問題