sed - wie verwende ich die Wortgrenze \ b richtig?

10

Ich möchte Anführungszeichen ersetzen, die am Anfang eines Wortes stehen.

Zum Beispiel:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"\
| sed "s/\b'/X/g"
a 'lineX a single ' after a  'keywordX with a few spaceXs for a program

aber wie Sie sehen können, werden sie am Ende der Wörter ersetzt, nicht am Anfang.
Wie ersetze ich diejenigen, die ein Wort beginnen?

Michael Durrant
quelle

Antworten:

11

Dies ersetzt 'bei Wortanfängen:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/'\b/X/g"
a Xline' a single ' after a  Xkeyword' with a few spaceXs for a program

Für Menschen, nicht für Computer, gibt es hier eine Besonderheit: Der Computer zählt space'sals zwei Wörter und ersetzt das, 'weil es am Anfang des zweiten Wortes steht.

Diskussion

\bmarkiert eine Wortgrenze, entweder Anfang oder Ende. Nun überlegen Sie \b'. Dies entspricht einer Wortgrenze, gefolgt von a '. Da 'es sich nicht um ein Wortzeichen handelt, bedeutet dies, dass das Ende des Wortes vor dem 'übereinstimmenden Wort stehen muss . Um die \bÜbereinstimmung am Anfang von Wörtern zu verwenden, kehren Sie die Reihenfolge um : '\b. Da 'es sich nicht um ein Wortzeichen handelt, stimmt dies nur überein, wenn ein Wort dem folgt '.

Einige Seds, wie GNU sed, unterstützen es \<, dem Wortanfang zu entsprechen. Dies hilft in Ihrem Fall nicht weiter, da 'es sich bereits nicht um ein Wortzeichen handelt und dies das Problem erzwingt.

Was tun gegen "Weltraum"?

Wenn Sie nicht möchten, dass das 'ersetzt wird, space'sweil das 'am Ende eines Wortes angezeigt wird, können Sie die Logik umkehren, indem Sie Folgendes verwenden \B:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/\B'/X/g"
a Xline' a single X after a  Xkeyword' with a few space's for a program

\Bstimmt an keiner Wortgrenze überein . Somit \B'passt in '(Raum-Zitat) , weil weder Raum noch Zitat sind Wortzeichen. Es stimmt nicht überein, space'weil e'es eine Wortgrenze ist: eist ein Wortzeichen und 'ist es nicht.

John1024
quelle