我想设置一个bash别名来自动grep目录中的所有日志;但是,为了使这个用户友好,我需要转义句点并添加一个空格边界,因此grep将不会匹配太多行。
首先,我检查确保我有正确的语法来逃避地址......
[mpenning@sasmars daily]$ echo 1.1.1.1 | sed "s/\./\\\\./g"
1\.1\.1\.1
[mpenning@sasmars daily]$
接下来我试图逃避一个CLI参数......但它并没有让我在那里......
[mpenning@sasmars daily]$ alias tryme='echo `sed "s/$argv[1]/\\\\./g"`'
[mpenning@sasmars daily]$ tryme 1.1.1.1
- >无限期挂起,直到我点击 cntl c
我意识到echo不会搜索,但这是一个简单的测试。
在bash别名的参数中转义句点的最简单方法是什么?
答案 0 :(得分:4)
你想要的是一个函数,你可以使用bash的内置替换语法:
$ function tryme() { echo "${1//./\.}"; }
$ tryme 1.1.1.1
1\.1\.1\.1
$ tryme "also. with ... spaces"
also\. with \.\.\. spaces
这样可以避免您提出sed
进程。
答案 1 :(得分:1)
根据§6.6 "Aliases" of the Bash Reference Manual:
在替换文本中没有使用参数的机制,如
csh
中所示。如果需要参数,则应使用shell函数(参见Shell Functions)。
另外,sed "s/$argv[1]/\\\\./g"
无论如何都不会有意义,如果它将参数放在sed模式而不是输入字符串中。
所以,你会写:
function tryme() {
echo "$(echo "$1" | sed "s/\./\\\\./g")"
}
或使用<<<
传入输入:
function tryme() {
echo "$(sed "s/\./\\\\./g" <<<"$1")"
}