2017-01-27 12 views
0

次のように私は、ファイル内のいくつかの置換を行っています:ドットが続くsedの使用して特定の文字列を代入

ファイル:

`include foo.h 

int main 
{ 
int foo 
foo and bar 
barfoobar 
} 

abc.txt私は内部の「foo」を交換したいの中括弧が含まれていますが、includeディレクティブに書かれている 'foo'を置き換えたくありません。

私が使用してみました:

sed -i "s/\bfoo\b/my_foo/g" 

出力:

`include my_foo.h 

int main 
{ 
int my_foo 
my_foo and bar 
barfoobar 
} 

任意の提案を?

答えて

0
sed '/include/b; s/foo/my_&/' foo 
include foo.h 

int main 
{ 
int my_foo 
} 

includeは、コマンドの最後に分岐ジャンプを発見された場合、これは、を意味します。あなたはすべてのエントリを置き換えたい場合はinclude

sed -i '/foo/ {/include/! s/foo/my_foo/g}' test

それとも でfoo除くラインを有するすべての行を置き換えたい場合は

+0

sed '/ include/b; s/\ bfoo \ b/my_foo/'トリックします..ありがとう –

0

これを試してみてください:

sed -i "/^[^`]/ s/\bfoo\b/my_foo/g" 

を「(バッククォート) `ではないだけその最初の文字の行に置換を適用します。」何、それはされません

+0

彼の 'include'行には、'# 'はありません。 – Barmar

+0

'foo'の後に文字(またはspcl)が続かないところで代用できる小切手を追加できますか?その意図で境界線(\ b)を追加しましたが、うまくいかないようです。 –

+0

@Barmar:初めて彼が投稿したとき、先頭の '# 'はMarkdownパーサにその行を見出しとして扱わせるためです。実際のファイルが '#'で始まるとは思わないと思います。 –

1

aの後に続く文字列と一致する。必要に応じて行末が続きます。

sed -E 's/foo[^.]?$/my_foo/g' test.txt 

拡張正規表現が必要です。 linux(man sed)上の-macosまたは-rでの-E。

は、それらが組み込まれている正規表現正規表現の探査を可能なhttp://www.regextester.com/などのテスター、またはIDEがたくさんある。

例えばRegex to match URL end-of-line or "/" character

+0

' foo'が行末にある場合、これは動作しません。あなたもそれを処理する必要があります。そして、あなたは '\ b'パターンを取り除いたので、単語の真ん中で' foo'を置き換えます。 – Barmar

+0

OK - 「質問の一部を置換したい」と回答しました。私はfoo.hを得るためにそれの後ろに[A-Z]を追加しますが、それは私の質問のようには見えません。開始時の単語境界の指定は意味があります。それはドットの後ではありません。 sed -E/foo \([:alpha:] {1})/ my_foo。\ 1/g 'test.txt - macos。この答えは間違っていましたが、これが邪魔になりました。 char。編集します。角括弧は何もしません。 – Interlated

+0

「質問の一部」を「置き換える」とは何ですか?彼は彼がそれを置き換えたくないと言った。質問の最後の行を読んでください。 – Barmar

0

私は、このコマンドでは、あなたが探しているものであると信じてfooのエントリを除くエントリfoo.

sed -i '/foo/ {/foo./! s/foo/my_foo/g}' test

質問とタイトルの最後の行があいまいであるように、私は両方の状況に答えました。

セッション出力:

$ cat test 
include foo.h 

int main 
{ 
int foo 
} 
$ 
$ sed -i '/foo/ {/foo./! s/foo/my_foo/g}' test 
$ cat test 
include foo.h 

int main 
{ 
int my_foo 
} 
関連する問題