grep 引号内的引号

grep 引号内的引号

示例.txt

alias znm="base64"
alias asu="sed 's/.\{4\}/&™/g'"
alias mmk="sed 's/\(.\{4\}\)\™/\1/g'"
alias mmk="sed 's/\(.\{8\}\)\™/\1/g'"

期望的输出:

alias asu="sed 's/.\{4\}/&™/g'"

但当我尝试这个时出现错误

grep -wo "alias asu="sed 's/.\{4\}/&™/g'"" example.txt

怎样做才正确呢?

答案1

grep -Fx -f /dev/stdin example.txt <<'PATTERN'
alias asu="sed 's/.\{4\}/&™/g'"
PATTERN

这可以避免引号和正则表达式字符出现的问题,并将模式按原样传递到grep标准输入中。该grep实用程序从标准输入读取模式,因为我们已要求它-f /dev/stdin使用 , 来执行此操作(在 Android 上,您可以改为使用-f /dev/fd/0)。

-F模式用作字符串而不是正则表达式,并-x确保我们仅匹配与模式完全匹配的行(就好像模式锚定到行的开头和结尾一样)。

使用它来测试该特定别名是否在文件中:

if grep -q -Fx -f /dev/stdin example.txt; then
    echo the alias is there
else
    echo the alias is not there
fi <<'PATTERN'
alias asu="sed 's/.\{4\}/&™/g'"
PATTERN

你的命令,

grep -wo "alias asu="sed 's/.\{4\}/&™/g'"" example.txt

确实是grep用一种模式来调用的文件名:

  • "alias asu="sed是模式(实际上是正则表达式,因为您不使用-F)。
  • 's/.\{4\}/&™/g'""是第一个文件名,因为 shell 会在不带引号的空格上中断字符串。
  • example.txt是第二个文件名。

显然,您可以确保引用所有特殊字符和引号,但使用此处文档稍微容易一些,因为您根本不必修改模式。

相关内容