【问题标题】:Repeating regex replace with SED用 SED 重复正则表达式替换
【发布时间】:2013-02-06 08:32:16
【问题描述】:

我有以下几行(实际上有大约 1M 行):

foo|||bar
qux||boo|fzx

请注意,每行正好包含 4 个字段,但字符数 可以超过 3 个。

我想做的是将every||替换为|nil|结果:

foo|nil|nil|bar
qux|nil|boo|fzx

用 sed 的方法是什么?

我试过了,但失败了:

sed 's/||/|nil/g'

【问题讨论】:

    标签: regex linux sed


    【解决方案1】:

    你需要重复替换直到它不变:

    sed ':a; s/||/|nil|/g; ta'
    

    但是这不会处理开头或结尾的空字段,因为您需要另外两个模式:

    sed 's/^|/nil|/; s/|$/|nil/; :a; s/||/|nil|/g; ta'
    

    测试

    输入:

    cat << EOF > infile
    foo|||bar
    qux||boo|fzx
    |||
    EOF
    

    运行它:

    <infile sed 's/^|/nil|/; s/|$/|nil/; :a; s/||/|nil|/g; ta'
    

    输出:

    foo|nil|nil|bar
    qux|nil|boo|fzx
    nil|nil|nil|nil
    

    一种奇怪的方式

    awk '{ for(i=1;i<=NF;i++) if(length($i)==0) $i="nil" } 1' FS='|' OFS='|'
    

    【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2018-08-22
    • 2013-08-25
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多