Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell sed:删除以标记结尾的行后面的空行_Shell_Sed - Fatal编程技术网

Shell sed:删除以标记结尾的行后面的空行

Shell sed:删除以标记结尾的行后面的空行,shell,sed,Shell,Sed,如何使用sed实现这一点 Input: Expected output: 1 | 1 2 MARKER | 2 MARKER | 3 MARKER | 4 |

如何使用sed实现这一点

    Input:                         Expected output:
    1               |              1
    2 MARKER        |              2 MARKER
                    |              3 MARKER
                    |              4
                    |              
                    |              5 MARKER
                    |              6
                    |              
    3 MARKER        |              
                    |              7 MARKER
    4               |              8
                    |              9
    5 MARKER        |                      
    6               |               
                    |              
                    |              
    7 MARKER        |                      
                    |              
    8               |               
    9               |               
首先,我尝试了这个方法:它不起作用,因为“#t或b起作用,因为d导致脚本中断。”

然后我尝试了这个,它几乎是有效的:((-)它没有删除3和4之间的行,我认为这是因为3在处理2的过程中被消耗,因此它的标记被丢失

/MARKER$/ {
#       i -- Line with MARKER
:my_branch
#   i -- in branch
    N
    s/MARKER\n/MARKER/
    t my_branch
    # I added the following but it doesn't help..
    /MARKER$/ b my_branch
}
我尝试了4-5个其他版本,但都不起作用

我这么做是因为我试图回答这个问题:,所以我开始从和学习sed

我知道有使用awk、perl等的解决方案,但我只是想学习使用sed


谢谢。

请看下面,我想这正是您想要的:(它在我的linux机器上用gnu sed运行)


看下面,我想这就是你想要的:(它在我的linux机器上运行,带有gnu sed)


我不理解您试图创建的转换。为什么输出中仍有空行(只是为了学习?)你能告诉我们你正在实施的规则吗?否则,非常好的帖子。谢谢你已经阅读的内容,知道了。祝你好运。对不起,没有看到推荐。也许你错过了在整个问题中包含标题。已删除。其他空行不应删除。我不理解您试图创建的转换。为什么输出中仍有空行(仅用于学习?)你能告诉我们你正在实施的规则吗?否则,非常好的帖子。谢谢你已经阅读的内容,知道了。祝你好运。对不起,没有看到推荐。也许你错过了在整个问题中包含标题。已删除。其他空行不应删除。谢谢。这适用于大文件吗?它看起来会在写入任何内容之前在模式空间中加载/处理整个文件。无论如何都接受作为答案,因为它回答了我的问题。您可以生成一个“大”文件,并尝试一下。;)谢谢。这适用于大文件吗?看起来它会在写入任何内容之前在模式空间中加载/处理整个文件。无论如何都被接受为答案,因为它回答了我的问题。您可以生成一个“大”文件,并尝试一下。;)
/MARKER$/ {
#       i -- Line with MARKER
:my_branch
#   i -- in branch
    N
    s/MARKER\n/MARKER/
    t my_branch
    # I added the following but it doesn't help..
    /MARKER$/ b my_branch
}
kent$  cat t
1         
2 MARKER  






3 MARKER  

4         

5 MARKER  
6         


7 MARKER  

8         
9         

kent$  sed -r ':a;N;s/(.*MARKER)\s+(\n.*)/\1\2/;ba;' t
1         
2 MARKER
3 MARKER
4         

5 MARKER
6         


7 MARKER
8         
9