4

私はsedテキストを見つけて置き換えるために使用しています、例:

set -i 's/a/b/g' ./file.txt

aこれにより、ファイル内ののすべてのインスタンスがに置き換えbられます。ファイルの最初の出現を除いて、のすべてのインスタンスをでsed置き換えるような例外を追加する必要があります。例:ab

There lived a bird who liked to eat fish.
One day he fly to a tree.

これは次のようになります。

There lived a bird who liked to ebt fish.
One dby he fly to b tree.

最初の出現を除いて、のすべてsedのインスタンスのみをで置き換えるようにスクリプトを変更するにはどうすればよいですか?ab

GNUsedバージョン4.2.1を使用しています。

4

3 に答える 3

5

より複雑なスクリプトを使用して、より完全な実装を行うことができます。

#!/bin/sed -nf

/a/ {
    /a.*a/ {
        h
        s/a.*/a/
        x
        s/a/\n/
        s/^[^\n]*\n//
        s/a/b/g
        H
        g
        s/\n//
    }

    : loop
    p
    n
    s/a/b/g
    $! b loop
}

これの機能は疑似コードで簡単に説明されています

if line contains "a"
    if line contains two "a"s
        tmp = line
        remove everything after the first a in line
        swap tmp and line
        replace the first a with "\n"
        remove everything up to "\n"
        replace all "a"s with "b"s
        tmp = tmp + "\n" + line
        line = tmp
        remove first "\n" from line
    end-if

    loop
        print line
        read next line
        replace all "a"s with "b"s
        repeat loop if we haven't read the last line yet
    end-loop
end-if
于 2012-10-17T15:16:07.610 に答える
5

これはうまくいくかもしれません(GNU sed):

sed 's/a/b/2g' file

また

sed ':a;s/\(a[^a]*\)a/\1b/;ta' file

これは、例えば調整することができます

sed ':a;s/\(\(a[^a]*\)\{5\}\)a/\1b/;ta' file

afterで置換aを開始しますb5 a

于 2012-10-17T14:57:49.613 に答える
2

1 つの方法は、すべてを置き換えてから、最初の置き換えを元に戻すことです ( potongに感謝します):

sed -e 'y/a/\n/' -e 's/\n/a/g' -e 'y/\n/b/'

改行は中間として機能するため、で始まる文字列はb正しく機能します。

上記は行ごとに機能します。ファイル全体に適用する場合は、最初にファイル全体を 1 行にします。

<infile tr '\n' '^A' | sed 'y/a/\n/; s/\n/a/; y/\n/b/' | tr '^A' '\n'

または、 potong's answerの sed コマンドをより簡単に使用すると、次のようになります。

<infile tr '\n' '^A' | sed 's/a/b/2g' | tr '^A' '\n'

Note ^A(ASCII 0x01) は で作成できますCtrl-vCtrl-a^Atr置き換えることができます\001

これは、ファイルに^A.

于 2012-10-17T14:49:48.970 に答える