【问题标题】:Delete two lines with sed if no text between them如果两行之间没有文本,则使用 sed 删除两行
【发布时间】:2014-06-29 22:33:32
【问题描述】:

我有一个包含以下文本的文件:

[Data]

hi

[Data]

one two three

[Data]

[Data]

right left

[Data]

[Data]

我正在寻找如何从 sed、awk 或其他东西中获取此输出:

[Data]

hi

[Data]

one two three

[Data]

right left

说明:我需要查看 [Data] 和 [Data] 之间是否有文本,如果没有文本我需要删除 [Data] 行和下一个空行。

你能帮帮我吗?非常感谢!

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    标题上写着sed,但它也被标记为awk,所以试试吧:

    awk '$0==s && p==$0{next} {p=$0}1' s="[Data]" file
    

    这是假设真实数据样本中每隔一行没有空行。

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed):

      sed ':a;$!{N;s/\n/&/3;Ta};/^\[Data\][^\n]*\n\n[^[][^\n]*\n$/b;s/\n//;D' file
      

      这会在模式空间中保留 4 行的滚动窗口,如果未找到预期的模式,则删除前两行,然后重新生成模式空间,最多为 4 行并重复。

      【讨论】:

      • 嗨 potong,这项工作如您所愿。谢谢你的解释。
      【解决方案3】:

      试试这个:

      sed ':a;N;$!ba;s/\n/###/g' file | sed 's/######\[Data\]######\[Data\]/######\[Data\]/g' | sed 's/###/\n/g'
      

      【讨论】:

        【解决方案4】:

        希望这会有所帮助。

        sed ':a;/$/{N;s/\n/#/;ba}' inputFile.txt|sed 's/\]#*\[Data\]/\]/g'|sed 's/#/\n/g
        

        【讨论】:

          【解决方案5】:

          使用 GNU awk 表示多字符 RS 和 \s 简写为 [[:space:]],这就是您所说的:

          $ awk -v RS='^$' -v ORS= '{gsub(/\[Data\]\s*\[Data\]/,"[Data]")}1' file
          [Data]
          
          hi
          
          [Data]
          
          one two three
          
          [Data]
          
          right left
          
          [Data]
          

          我强调“说”,因为您发布的预期输出与您对您想要做的事情的描述(i need to look if between [Data] and [Data] have no text, if not contain text i need to delete the [Data] line and the next empty line.)不符,因为它似乎也删除了末尾的“[Data]”行文件。

          【讨论】:

            猜你喜欢
            • 2018-09-05
            • 2021-05-26
            • 1970-01-01
            • 2021-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多