【问题标题】:remove all the lines from file starting from "{" to "}" using sed使用 sed 从文件中删除从“{”到“}”的所有行
【发布时间】:2012-05-25 20:15:39
【问题描述】:

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

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 脚本的新手,一些带有答案的解释将大有帮助。

提前致谢。

【问题讨论】:

  • 你可以使用 awk 还是只需要 sed 中的东西?
  • @Raghuram 我正在学习 sed,如果你可以用 sed 来做,那就太好了,否则 awk 也可以,但请给出答案并给出解释..谢谢
  • 这个大括号语法可以嵌套吗?此语法是否可以包含 { 含义已更改的字符(例如,在字符串文字内部,或以其他方式转义?可能有类似 foo { bar { "nested{stuff" } }

标签: shell unix sed awk tr


【解决方案1】:

这可能对你有用:

sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
  • 第一个命令删除所有单行/^control_data {.*}$/d
  • 第二个命令删除所有块/^control_data {/,/^}$/d

【讨论】:

  • 这是迄今为止最明确的答案。事实上,简单的sed '/^control_data {/,/^}$/d' 对给定的测试用例工作得很好。其他答案是有效的,但使用了不必要的时髦技术,因此用简单的解决方案掩盖了简单的问题。我不会对其他答案投反对票(因为它们没有错),但它们让它看起来比实际困难得多。
【解决方案2】:

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

[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-fu 很弱,那么我不知道该怎么称呼我的 sed-fu 水平 .. 上述解决方案有效,但我需要一些时间才能完全理解它。你能告诉你是否每次返回标签 a 并用“}”删除行时,所有内容是如何删除的
  • @user1271244 回到标签后,我们得到下一行而不对当前行做任何事情。请注意,使用 -n 选项,什么都不做意味着不将其打印出来(因此最后的 p; 打印出不受块影响的行
  • 我已将 d; 更改为 n; 以减少混乱
【解决方案3】:

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

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

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

【讨论】:

  • 很漂亮:) .. 我会努力记住这个技巧很长一段时间...谢谢
  • 有两件事需要注意。 1) 对于包含: 的文件将无法正常工作。 2)对于大文件可能效率低下。尽管如此,在这种情况下仍然有效。 +1
  • 您假设 sed 将接受没有 EOL 的行。传统的 sed 实现可能会忽略这样一个不完整的行。
  • 您可以像这样修复缺少换行符:{ tr '\n' ':' < ip_file.txt; echo; } | sed ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2023-03-05
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多