3

是否可以使用 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 每行最多执行一次替换?

4

1 回答 1

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
于 2013-03-08T01:12:00.817 回答