0

我想设置一个 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

-> 无限期挂起,直到我击中cntlc

我意识到 echo 不会搜索,但这是一个简单的测试。

在 bash 别名的参数中转义句点的最简单方法是什么?

4

2 回答 2

4

你想要的是一个函数,你可以使用 bash 的内置替换语法:

$ function tryme() { echo "${1//./\.}"; }
$ tryme 1.1.1.1
1\.1\.1\.1
$ tryme "also. with ... spaces"
also\. with \.\.\. spaces

这将避免你分叉一个sed进程。

于 2012-09-14T15:58:32.807 回答
1

根据Bash 参考手册的第 6.6 节“别名”

没有在替换文本中使用参数的机制,如csh. 如果需要参数,则应使用外壳函数(请参阅外壳函数)。

此外,sed "s/$argv[1]/\\\\./g"如果它将参数放在 sed 模式而不是输入字符串中,那么无论如何也没有任何意义。

所以,你会写:

function tryme() {
    echo "$(echo "$1" | sed "s/\./\\\\./g")"
}

或者,<<<用于传入输入:

function tryme() {
    echo "$(sed "s/\./\\\\./g" <<<"$1")"
}
于 2012-09-14T15:59:56.517 回答