Bash:用bash更新文件的特定部分

时间:2017-11-07 12:50:39

标签: bash awk sed

我有一个makefile(Makefile.inc),它列出了目录中的.c文件。

#                                                                                                                                                                                  
# 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的位置。

实施例: 将s.c和b.c添加到源目录并运行脚本后,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
..  

几个条件:

  1. Makefile.inc中的.c文件列表应该排序
  2. LIB_FOO_BAR_SRCS的行号未知。但是,变量LIB_FOO_BAR_SRCS肯定以“LIB_”开头,以“_SRCS”结尾。
  3. 脚本应该是通用的,因为我打算将它用于大量的Makefile。
  4. 我找到了一种方法来获取_SRCS并获取行号。 我还格式化了要添加的列表。

    #!/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)?

1 个答案:

答案 0 :(得分:0)

awk救援!

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

将使用给定参数将模式LIB_.*_SRCS之间的行替换为空行。

相关问题