Bash 如果sed中满足条件,则开始新循环

Bash 如果sed中满足条件,则开始新循环,bash,sed,Bash,Sed,我在一行上执行几个命令(GNU-sed),如果满足某些条件,我想跳过其余的命令 例如: 我想用4替换所有d 如果行以A、C或E开头,则跳过其余命令(其他替换等) 我只想使用基本正则表达式。如果我可以使用扩展正则表达式,这将是微不足道的: sed -r 's/d/4/g; /^(A|C|E)/! { s/a/1/g; s/b/2/g; s/c/3/g }' data 现在,使用BRE,这将很好地工作,但对于更多的情况,这将非常难看: sed 's/d/4/g; /^A/! { /^C/! { /

我在一行上执行几个命令(
GNU-sed
),如果满足某些条件,我想跳过其余的命令

例如:

  • 我想用
    4
    替换所有
    d
  • 如果行以
    A
    C
    E
    开头,则跳过其余命令(其他替换等)
  • 我只想使用基本正则表达式。如果我可以使用扩展正则表达式,这将是微不足道的:

    sed -r 's/d/4/g; /^(A|C|E)/! { s/a/1/g; s/b/2/g; s/c/3/g }' data
    
    现在,使用BRE,这将很好地工作,但对于更多的情况,这将非常难看:

    sed 's/d/4/g; /^A/! { /^C/! { /^E/! { s/a/1/g; s/b/2/g; s/c/3/g } } }' data
    
    输入示例:

    Aaabbccdd
    Baabbccdd
    Caabbccdd
    Daabbccdd
    Eaabbccdd
    
    示例输出:

    Aaabbcc44
    B11223344
    Caabbcc44
    D11223344
    Eaabbcc44
    

    这只是一个例子。我不是在寻找不同的方法来解决这个问题。我想知道一些更好的方法来开始新的周期。

    我建议使用
    b

    /^\(A\|C\|E\)/b
    
    man sed

    b标签
    :分支到标签;若省略了标签,则分支到脚本的末尾


    啊……我们忘了我忘了可以用BRE来使用
    \(\\\\\)
    b
    是一个很好的建议。谢谢!:)@是的,但这只是一个例子。条件可能更复杂:)@mickp
    \\\124;
    在GNU中工作,仅用作BRE的扩展。“GNU sed BRE和ERE只在需要逃逸的方面有所不同。@BenjaminW。哦,我明白了。所以在非GNU
    sed
    中,我必须做:
    /^A/b/^B/B…
    ?@mickp要获得替代,您需要ERE,目前不需要,但可能需要。建议对ERE使用
    -E
    ;GNU sed支持
    -r
    和(直到最近才正式支持)
    -E