使用 sed 从文件中删除从“{”到“}”开始的所有行
题
我有一个文件,其内容如下:
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 脚本新手,一些带有答案的解释将对我有很大帮助。
提前致谢。
解决方案
这个可能不是一个理想的一个,但是这个二手sed(你的sed代码)
cat ip_file.txt | tr '\n' ':' | sed "s/control_data\([^}]*\)}//g" | tr ':' '\n'
.
逻辑:我正在将所有新行转换为:然后使用您的SED代码然后转换全部:到纽格林 注意:我的假设是:不会在文件中存在。
其他提示
我的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
. 这可能对你有用:
sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
- 第一个命令删除所有单行
/^control_data {.*}$/d
- 第二个命令删除所有块
/^control_data {/,/^}$/d
不隶属于 StackOverflow