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

両方の置換が最初の行に適用されるため、これは正しくありません。

行ごとに最大1つの置換を実行するように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 に答える