使用sed自动将文本插入bash case语句

时间:2014-04-01 00:56:07

标签: bash 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)到第一个;;的非贪婪的小球,但​​我似乎无法让它工作。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果您无法选择输入文件,可以按照以下说明解决:

sed -e '/^ *start) *$/ { :b; N; s/\( *\);;/\1my_command_here\n&/; te; bb; }; :e'
  1. 查找start)
  2. 阅读并附加行,直到找到要替换的;;为止。
  3. 将其替换为您自己的命令
  4. 但是,如果您正在编写此脚本并希望能够自动插入要在启动时运行的命令,则应创建一个目录并在所需的位置处理其中的所有文件。

答案 1 :(得分: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即可完成任何复杂程度的文本处理。但不应该::)