我一直难以理解我目前正在努力解决的问题。我有一个包含类似于以下内容的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 :(得分:1)
如果您无法选择输入文件,可以按照以下说明解决:
sed -e '/^ *start) *$/ { :b; N; s/\( *\);;/\1my_command_here\n&/; te; bb; }; :e'
start)
。 ;;
为止。 但是,如果您正在编写此脚本并希望能够自动插入要在启动时运行的命令,则应创建一个目录并在所需的位置处理其中的所有文件。
答案 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
即可完成任何复杂程度的文本处理。但不应该::)