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