web-dev-qa-db-ja.com

「。」をエスケープする方法sedまたはgrepで?

私はfileを持っています

denm.xyz
denm.abc
denm.def
denm_xyz
denm_abc
denm_def

.が含まれているものを抽出します。

私は試した

grep "denm\.*" file
grep 'denm\.*' file

sed "/denm\.*/p" file
sed '/denm\.*/p' file

これらはfileのすべてに一致しています

ただし、awkを使用する

awk '/denm\./' file 

働いた!!

grepまたはsedを使用して同じことを行う方法

6
Ramana Reddy

近かったので、*を削除する必要があります。これは、前のトークン(この場合は.)のゼロ以上の一致を意味します。その結果、demn_もゼロ.の条件に一致したため、結果に表示されます。

だからあなたができる:

grep 'denm\.' file.txt 

同様にsedで:

sed -n '/denm\./p' file.txt

sed-nオプションを見逃していることに注意してください。これがない場合、sedはすべての行も出力します。

また、非常に多くのレベルの精度を追加して、複雑な場合に必要なものを正確に取得することもできますが、それを開始点としてください。

例:

% grep 'denm\.' file.txt
denm.xyz
denm.abc
denm.def

% sed -n '/denm\./p' file.txt
denm.xyz
denm.abc
denm.def
13
heemayl

\.*は、ゼロを含む「文字.の任意の数の出現」を意味します。下線付きのファイル名は、denmで始まり、その後に.がゼロ出現するため、一致します。 grep "denm\." fileは機能します。

7
fkraiem

必要なのが.を含む行だけである場合、正規表現の代わりに固定文字列でgrepを使用しました。

grep -F . file

man grep から:

-F, --fixed-strings
      Interpret PATTERN as a  list  of  fixed  strings,  separated  by
      newlines,  any  of  which is to be matched.  (-F is specified by
      POSIX.)

固定文字列では、すべての正規表現の特殊文字は意味を失います。

sedには対応するオプションがありません。

3
muru

私はエスケープするためにバックスラッシュの代わりにブラケットを使用する傾向があります:

egrep "denm[.].*" file
sed -r 's/denm[.]/.../'

これにより、バックスラッシュを回避するかどうか、どのように回避するかを考える手間が省けます。 (最後の.*はここでは冗長です。)

1
krlmlr