私は文字列を持っています
/abc/gef \*(cse,fff)
ファイルから削除するには、文字列パターン全体が一致する必要があります。以下を試してください。
sed -i '//abc/gef \*(cse,fff)/d' filename
ただし、これによりエラーが発生します。
sed: -e 式 #1, char xx: sed の最新バージョンが必要です。
また、成功せずに次のオプションを試しました。
sed -i '/\/abc\/gef \*(cse,fff)/d' filename
sed -i 's|/abc/gef \*(cse,fff)||g' filename
正しいコマンドは何ですか?
答え1
以下はGNU sedバージョン4.5と4.7で動作し、この文字列を含むすべての行を削除します。
sed '/\/abc\/gef \\\*(cse,fff)/d' file
文字列の2つのインスタンスをエスケープ\
して区切り文字として扱わないようにする必要があります。それ以外の場合、区切り文字は前の文字に展開されます。後者は文字列と一致しません。/
*
f
s
フル行ではなくファイル全体から文字列自体のみを削除したい場合は、別の文字を区切り文字として受け入れるオプションを使用することもできます。
sed 's|/abc/gef \\\*(cse,fff)||g' file
|
エスケープする必要がないように区切り記号として機能します/
。
要件を満たしていることを確認したら、ファイルを内部で編集するには、次のものを使用できます-i
。
sed -i '/\/abc\/gef \\\*(cse,fff)/d' file
sed -i 's|/abc/gef \\\*(cse,fff)||g' file
編集:質問の文字列が最初に投稿されたときとは異なるため、回答を更新しました。
答え2
問題は、\
(エスケープ文字)と*
(0以上)の両方が正規表現で特別な意味を持つことです。脱出するリテラル文字として使用します。今何かを脱出する方法は、\
前にを追加することです。したがって、*
「0以上」を意味するのではなく、文字通りアスタリスクを一致させるにはを書くことができます\*
。同様に、エスケープを使用するには、次のように\
書くことができます\\
。
$ cat file
foo
bar
/abc/gef \*(cse,fff)
baz
そして:
$ sed '/\/abc\/gef \\\*(cse,fff)/d' file
foo
bar
baz
/
is以降//
で一致演算子をどのようにエスケープしたかに注意してくださいsed
。だから私たち/\/abc\/gef
は//abc/gef
。d
最後にあるのは、「このパターンに一致するすべての行を削除します」を意味します。
答え3
これはgrepの仕事のように聞こえます。
$ cat file
line 1
line 2
/abc/gef *(cse,fff)
line 4
$ grep -Fxv '/abc/gef *(cse,fff)' file
line 1
line 2
line 4