示例.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
是第二个文件名。
显然,您可以确保引用所有特殊字符和引号,但使用此处文档稍微容易一些,因为您根本不必修改模式。