1

我有一个文件,其内容如下:

control_data {
some data dadadadf 
some data fsfsfs
some more data
.
.
.
}
more data below 
{
.
.
}

我想将数据从“control_data”删除到第一个“}”

我尝试了一个命令

sed "s/control_data\([^}]*\)}//g"

但这仅在我们没有多行时才有效,例如。当我们有以下数据时,此命令有效:

control_data {some data dadadadf some data fsfsfs some more data...}more data

它给 :

more data {....} 

当我们有跨多行的数据时,如何使这个命令工作?我是shell脚本的新手,一些带有答案的解释将对帮助大有帮助。

提前致谢。

4

3 回答 3

3

这个可能不是一个理想的,但是这个使用了 sed(你的 sed 代码)

cat ip_file.txt | tr '\n' ':' | sed "s/control_data\([^}]*\)}//g" | tr ':' '\n'

逻辑:我将所有新行转换为:,然后使用您的 sed 代码,然后将所有:转换为换行符注意:我的假设是:不会出现在文件中的任何地方。

于 2012-05-18T09:09:47.203 回答
2

我的 sed-fu 很弱,但这是我的工作(使用这个答案作为指导):

[me@home]$ sed -n '/^control_data {/{:a;n;/^}/!ba;n};p' input_file.txt
more data below 
{
.
.
}

这是命令的细分

sed -n "             # "-n" = suppress automatic printing of pattern space
/^control_data {/ {  # if (line matches control data)
   :a;                 #   mark this spot with label a
   n;                  #   get next line
   /^}/!ba             #   if (doesn't start with "}") go back to label a
   n;                  #   get next line before leaving this control block
};                   # end if
p;                   # print everything else not affected by previous block
" input_file.txt
于 2012-05-18T09:15:09.223 回答
1

这可能对您有用:

sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
  • 第一个命令删除所有单行/^control_data {.*}$/d
  • 第二个命令删除所有块/^control_data {/,/^}$/d
于 2012-05-18T13:54:25.087 回答