在bash别名$ argv中自动转义IP地址

时间:2012-09-14 15:48:04

标签: linux sed bash

我想设置一个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别名的参数中转义句点的最简单方法是什么?

2 个答案:

答案 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")"
}