sed - 一致から複数のパターンを除外する方法

sed - 一致から複数のパターンを除外する方法

私は現在1つを除いて、うまく動作するsedセットを持っています。

私が問題を経験している具体的な表現は次のとおりです。

sed -i '/[^}.to]\.to[[:space:]]/ s/\(\S\)/expect(\1/' ../_spec_seded/"$file"

これでうまくいきます。デフォルトでは、式の先頭を
見つけて挿入します。具体的には、動作する一致を見つけると除外されます。.toexpect}.to.to

今、検索一致から「これ」または「それ」も除外したいと思います。私として}.to または end.to

つまり、代わりに

/[^}.to]\.to[[:space]]/

私は以下を持っているべきです:

/[^}.to|^end\.to]\.to[[:space]]/
/[^}.to][^end\.to]\.to[[:space]]/
/[(^}.to|end\.to)]\.to[[:space]]/
/[^(}.to|end\.to)]\.to[[:space]]/

このように使用すると、角かっこを脱出する必要がありますか?

/[^\(}.to|end\.to\)]\.to[[:space]]/

それも|

/[^\(}.to\|end\.to\)]\.to[[:space]]/

ゲームを動作させようとしています。

stuff.to do thing
stuff).to do thing
this.to that
all.all.all.to do
pretend.do  # Note this edge case! (pretend contains "end"!) 

しかし、

this will be here }.to do
last.end}.to do
all.this at the end.to
none at allend.to

そして

all.this at the 
end.to # i.e. no spaces before as it is the start of the line.

一般的に(すべての言語)否定的にORを使用するのは難しいようです(誤検出による)。

答え1

この質問に対する私のコメントに対するあなたの回答をお待ちしています。私の答えは次のとおりです。

  • まず、[^}.to]望むことをしない。そうだろういいえパターンのない行と一致します}.to。どんなものにもマッチする特徴.、、}またはt除外o。つまり、たくさんワイヤー。

  • 仕事をより簡単にするために、基本的に何も印刷せずにsedすべてを印刷するように指示します。とは別に除外するパターンに一致する行は次のとおりです。

    sed -n '/\(\bend\|}\.to\)/!p' your_file
    

end.to次に、単語の境界内に含まれていない(たとえば、allend.to計算されていない)または}.to

また、一致する行のみを印刷するには、\.foo[[:space:]]不要なパターンに一致する行を削除して条件付き印刷を追加します。

sed -n '/\(\bend\|}\.to\)/d;/\.to[[:space:]]/p' your_file

もちろん、一致と印刷の間に必要な代替項目を適用できます。

sed -n '/\(\bend\|}\.to\)/d;/\.to[[:space:]]/s/foo/bar/g;p' your_file

答え2

ほとんどの場合、これはうまくいくようです。

今後:

sed -i 's/[^}.to].to[[:space:]]/).to /' ../_spec_seded/"$file"

後ろに:

sed -i 's/[^}.to|end.to].to[[:space:]]/).to /' ../_spec_seded/"$file"

関連情報