sedが私が要求したよりも多くのことをするのはなぜですか?

sedが私が要求したよりも多くのことをするのはなぜですか?

sed -i -e "s/..\///" -e "s/type_properties\///" testfile次のファイルに適用するとき:

#include "../../../../include/concepts/type_properties/operations/has_or_op_v.hpp"

int main() {
    // Test has_not_op_v.
}

次のように出力されます。

#include "../../../include/concepts/operations/has_or_op_v.hpp"

int main() {
  / Test has_not_op_v.
}

私はsedだけを削除し../て削除したいのですtype_properties/が、これは私の意見も壊れます。

答え1

役割.メタ文字。つまり特別な意味があるという意味だ。.「単一文字または文字と一致」を意味します。リテラル.文字のみを一致させようとします。

.に変更すると、\.正しい出力が得られます。

例:

sed -i -e "s/..\///" -e "s/type_properties\///" testfile

になる:

sed -i -e "s/\.\.\///" -e "s/type_properties\///" testfile

答え2

まず、sed -iテストに使用しないでください。最初に実行し-i、結果を確認せずに。正しいと思われるとわかったらそれから-iファイルへのコミット変更が追加されました。

その理由は、sed要求した以上のようです。なぜなら、main()関数のコメントは、2つの式..\/(2文字とスラッシュ)の最初の式と一致するからです。

で始まる行にのみ変更を適用したい場合は、#include次のものを使用できます。

sed -e '/^#include/{s%\.\./%%; s%type_properties/%%;}' file.c

ここでは、文字列で始まる行でのみ2回の置換が行われます#include。また、最初の表現では、2つの点を正しくエスケープし、「すべての文字」ではなく点と一致するようにしました。一致するテキストにスラッシュが含まれているため、コマンドで代替区切り文字を使用することを選択しました%s

関連情報