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