2014-04-01 38 views
0

我一直在困惑着一个我目前正试图弄清楚的问题。我有一个包含类似于下面一个bash case语句文件:使用sed自动插入bash case语句的文本

#!/bin/bash 
# some stuff here 
case "$1" in 
    start) 
    # some more stuff here 
    ;; 
    stop|restart) 
    # here is some more stuff 
    ;; 
    *) 
    # stuff stuff stuff 
    ;; 
esac 

我想(用脚本),使用sed第一个case语句的末尾插入一些命令。到目前为止,我想出了以下内容:

sed -e '/^[ \t]*start)/,$ { s/^\([ \t]*\);;/\1my_command_here\n\1;;/ }' 

它会插入命令到所有case语句,而我似乎无法有与之相匹配的只有第一个声明。以下是我想要的sed命令输出:

#!/bin/bash 
# some stuff here 
case "$1" in 
    start) 
    # some more stuff here 
    my_command_here 
    ;; 
    stop|restart) 
    # here is some more stuff 
    ;; 
    *) 
    # stuff stuff stuff 
    ;; 
esac 

我最初打算非贪婪水珠从start)到第一;;但我似乎无法得到那个工作要么。有任何想法吗?

+0

在这种情况下不'awk'会更好? – user3159253

回答

1

如果你无法选择你的输入文件所描述的,你可以解决它:

sed -e '/^ *start) *$/ { :b; N; s/\(*\);;/\1my_command_here\n&/; te; bb; }; :e' 
  1. 查找start)
  2. 读取并追加行,直到找到要替换的;;
  3. 与命令,随后本身

但是,如果你正在写这个剧本,并希望能够自动插入命令就开始运行,你应该创建一个目录和源中的所有文件替换它在你想要的位置。

+0

不错的木雕神奇:) – user3159253

+0

谢谢你做的伎俩!我将不得不看看你使用的一些修饰符。 –

+0

确保这些修饰符确实存在于其他sed变体(如BSD sed)中,如果您需要可移植性 – user3159253

0

事情是这样的:

awk ' 
    BEGIN { in_start = 0; } 
    $1 == "start)" { in_start = 1; } 
    $1 == ";;" && in_start == 1 { printf "some_command;\n"; in_start = 0; } 
    { print; } 
' <your.init> 

有可能的,任何复杂的文本处理可以用裸sed来完成。但没有任何应该:)