2017-01-28 8 views
0

wordの接頭辞がpreで、prewordsedであるすべてのインスタンスを置き換えたいとします。そのため、のprewordは交換しないでください。ただし、唯一のwordprewordに置き換えてください。 sedを使用して特定のプレフィックスで始まらない単語を置き換えます

は、私はそう

sed -E -i 's/(?<!pre)word/preword/g'

のような通常の負のルックの背後にある正規表現を試みたが、それは私がGNU sedは、いくつかの異なる方法があることを読んだ

sed: -e expression #1, char 22: Invalid preceding regular expression

エラーになります正規表現を扱うこれを行うには何ができますか? GNUで

+0

は 'foreword'は' forepreword'になるべきでしょうか?要件を明確にし、すべてのユースケースをカバーする簡潔でテスト可能なサンプル入力と予想される出力を表示します。 –

答えて

2

はsedを:

sed 's/\bword\b/preword/g' file 

\b

+0

それは間違いなくトリックでした!ありがとう@サイラス! :) – samurdhilbk

+2

短所: 'microsoftword'は置き換えられません。私は見る。 – Cyrus

+0

しかし、私のアプリケーションは実際には最初に境界線を持つ言葉だけを置き換えたいと思っています。 – samurdhilbk

3

あなたは、前に "前" と "言葉" を避けるために持って一致しないゼロ幅のワード境界です」 「プレ」もシステムに置き換えてください:

sed -E 's/(pre)?word/preword/g' 

他の方法(より一般的)キャプチャグループすべてのことは、「プレ」ではありません:あなたはまた は小さなパーサを書いて考えることができ、複雑な正規表現を必要とする場合は

sed -E 's/(^|[^e]|^e|[^r]e|^re|[^p]re)word/\1preword/g' 
0

$ cat r.awk 
BEGIN { 
    re_wrd = "^[A-Za-z]+" # what we consider a word 
    re_sep = "^."  # the rest is a separator 
} 

function advance() { # sets `tag' and `tok'; eats a part of `line' 
    if  (match(line, re_wrd)) tag = "wrd" 
    else if (match(line, re_sep)) tag = "sep" 
    tok = substr(line, 1,   RLENGTH) 
    line = substr(line, RLENGTH + 1  ) 
} 

function process_sep() { # copy to output 
    ans = ans tok 
} 

function process_wrd() { 
    sub(/^word/, "preword", tok) # replace only at the beginning 
    ans = ans tok 
} 

{ 
    line = $0; ans = tag = tok = "" 
    while (length(line) > 0) { 
     advance() 
     # uncomment for tracing 
     # print tag, "<" tok ">" | "cat 1>&2" 
     if  (tag == "sep") process_sep() 
     else if (tag == "wrd") process_wrd() 
    } 
    print ans 
} 

使用法:

$ echo 'preword...microsoftword word wordword,word.word-preword' | awk -f r.awk 
preword...microsoftword preword prewordword,preword.preword-preword 

トレース:

wrd <preword> 
sep <.> 
sep <.> 
sep <.> 
wrd <microsoftword> 
sep < > 
wrd <word> 
sep < > 
wrd <wordword> 
sep <,> 
wrd <word> 
sep <.> 
wrd <word> 
sep <-> 
wrd <preword> 
+1

'echo'とバッククックの使用例はエラーを引き起こすでしょうか? –

+0

@ベンジャミンW。一定。ありがとう。 – slitvinov

関連する問題