如何用 sed 或 grep 转义“。”?

如何用 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

答案1

你已经接近了,你只需要删除,*这意味着在本例中,前一个标记有零个或多个匹配项.。结果demn_也会显示在结果中,因为它符合零的条件.

因此你可以这样做:

grep 'denm\.' file.txt 

同样地,在sed

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

请注意,您错过了-n选项sed,如果没有它sed也会打印所有行。

还可以添加很多级别的精度,以便在复杂情况下准确获得您想要的结果,但请将其作为开始。

例子:

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

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

答案2

\.*表示“字符.”的出现次数为任意次,包括零次。由于带下划线的文件名以 开头,denm后面跟着零次出现的字符.,因此它们是匹配的。grep "denm\." file将起作用。

答案3

如果您需要的只是其中包含的行.,请使用带有固定字符串的 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没有对应的选项。

答案4

我倾向于使用括号而不是反斜杠来转义:

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

这省去了我思考是否以及如何转义反斜杠的麻烦。(.*这里的最后一个是多余的。)

相关内容