是否有可能告诉sed每行最多执行一次替换?

时间:2013-03-08 01:03:36

标签: sed

是否可以使用sed封装以下伪代码?

for line in lines:
    if line == "foo":
        print "FOO"
    else:
        print "- " + line

这是我尝试的第一件事:

> echo 'foo
> bar
> baz' | sed -e 's/^foo$/FOO/' -e 's/^/- /'
- FOO
- bar
- baz

这是不正确的,因为两个替换都应用于第一行。

是否可以告诉sed每行最多执行一次替换?

1 个答案:

答案 0 :(得分:3)

您可以通过在模式前添加前缀来限制替换所影响的行:

sed -e '/^foo$/! s/^/- /' -e '/^foo$/ s//FOO/' infile

更好的选择是使用t分支命令,如果先前的替换成功,它将转到下一行:

sed 's/^foo$/FOO/; t; s/^/- /' infile

或者更便携:

sed -e 's/^foo$/FOO/' -e t -e 's/^/- /' infile

两种情况下的输出:

FOO
- bar
- baz