数値を置き換える正規表現が 'sed' では機能しません。

数値を置き換える正規表現が 'sed' では機能しません。

Linux Bashを使用してください。

1000私のファイルには次のコードがあり、数値()を別の値に変更したいと思います。

文書:

//...
if (counter==(1000)) {
// ...

私は次のコマンドを試しました。

sed 's/[0-9][0-9]+/9999/g' file.cpp

しかし、何も変わりません。

また、これらの変化が永久的であることを願っています。どうすればいいですか?

答え1

+あなたは数量子を使用しています拡張正規表現構文設定ですが、デフォルトのsed正規表現がデフォルトで使用されます。したがって、フラグを追加してEREを有効にする必要があります-E

sed -E 's/[0-9][0-9]+/9999/' file.cpp

または、対応する BRE 構成を使用します。

sed 's/[0-9]\{2,\}/9999/' file.cpp

@Stéphane Chazelasが指摘したように、携帯性は良いです。


修正されますので参考にしてください複数の連続した数字を含む行グループを次に置き換えて、9999例と一致する行のみを確認するには

if (counter==(1000)) {

影響を受けたので、適切な項目を追加することをお勧めします。アドレス指定子一致をより具体的にしてください。

sed '/if (counter==([0-9]\{2,\}))/s/[0-9]\{2,\}/9999/' file.cpp 

これにより、一致する行でのみ交換が行われます。if (counter==(two-or-more-digit-number))

g入力例では、その行には対応する数値グループが1つしかないため、このオプションは不要なようです。


ファイルを直接変更するために、ほとんどのsed実装は-i「in-place」修正フラグを理解しています。繰り返しますが、@Stéphane Chazelasが正しく指摘したように、これを他のフラグと一緒に使用する場合は、-iバックアップファイルを生成するために使用されたサフィックスに対して期待どおりの順序が正しいことを確認してください(GNUでは空かもしれませんが、sedFreeBSD / MacOSの実装):

  • sed -i '' -E 's/.../.../'FreeBSDで動作しますsed
  • sed -i -E 's/.../.../'それともsed -Ei 's/.../.../'GNUで作業する予定ですか?sed
  • sed -iE 's/.../.../'Eバックアップサフィックスとして扱われるので機能しません。

関連情報