【问题标题】:how can I add a space between each consecutive pipes with sed如何使用 sed 在每个连续管道之间添加空格
【发布时间】:2015-09-08 01:00:21
【问题描述】:

我有这样的输入:

|non-empty|||something|||

我需要改变的是我们的wiki引擎将正确显示它,这意味着每个“空”字段都需要有一个空格:

|non-empty| | |something| | |

我试图通过像这样使用 sed 来实现这一点:

sed -E -e 's/\|\|/| |/g'

但这只是在每行的第一个和第二个连续管道之间添加了一个空格(尽管 /g 标志在那里)为什么会这样,我该如何解决?

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    使用 sed 和测试

    sed ':1;s/||/| |/g;t1' file
    

    这使用 test 来保持循环,在连续的小节之间放置一个空格。

    输出:

    |non-empty| | |something| | |
    

    或类似的 awk

    awk '{while(gsub(/\|\|/,"| |"))1}1' file
    

    【讨论】:

    • s/// 命令中添加g 以在最多2 次通过中完成
    • @NeronLeVelu Woops,当我添加 awk 命令时,我就是这样做的。谢谢:)
    【解决方案2】:
    $ echo '|non-empty|||something|||' | sed 's/||/| |/g; s/||/| |/g'
    |non-empty| | |something| | |
    

    给定|||,当您执行s/||/| |/g 时,第二个| 将作为第一次替换的一部分进行处理,因此之后无法匹配,因此在查找下一个|| 时,sed 开始于第三个|,所以从那里找不到||。您可以通过添加第二个 s/||/| |/g 来轻松解决问题,因为这将从行首重新开始,并替换所有在第一遍中未找到/替换的 ||s。

    【讨论】:

    • 到目前为止,我更喜欢这种简单的解决方案,而不是 9999 的解决方案,因为它也适用于 Mac
    【解决方案3】:

    你快到了,只需将其更改为:

    sed -E -e 's-\|\|- | | -g'
    

    请注意,您可以使用任何字符作为分隔符,只要您保持一致即可。这里我将/ 替换为- 以使其更清晰。

    【讨论】:

    • @MarounMaroun,这还会在最后一个/第一个非空字段之前和之后添加一个空格吗?例如:“|非空|||” => "|非空_|_|_|"
    【解决方案4】:

    您可以为此使用 awk:

    s='|non-empty|||something|||'
    awk 'BEGIN{FS=OFS="|"} {for (i=2; i<=NF; i++) if ($i == "") $i = " "} 1' <<< "$s"
    |non-empty| | |something| | |
    

    【讨论】:

      【解决方案5】:

      /g 标志是“全局匹配”:匹配同一行中的模式多次。当你有三个管道时,你的两个管道模式匹配前两个管道,让最后一个管道单独处理。如果您有四个连续的管道,您将匹配前两个管道,然后匹配最后两个管道:|||| 变为 | || |

      /g 不是递归标志。你想用| |递归替换||。为此,您需要使用标签和测试:@9999999999999999999999999999999 的答案是 sed。

      【讨论】:

        【解决方案6】:
        sed 's/|/| /g;s/| \([^|]\)/|\1|/g' YourFile
        

        | 之后添加一个空格,在| 之后删除没有| 的空格。通过这种方式,没有递归,并且每个管道都被处理而不排除下一个。 也符合 Posix 标准

        【讨论】:

        • 你错过了结束/,这对我也不起作用,留下两个||像OP一样在一起。我认为没有任何方法可以在不使用某种形式的递归的情况下使用 sed(任意数量的|)来做到这一点。
        • 对不起,我忘记了最后一个/ 并在第一个s/// 中放了2 个管道,第一个替换是1 个管道,以避免连续跳3 个管道
        猜你喜欢
        • 2017-10-19
        • 2010-10-14
        • 2021-12-01
        • 2020-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多