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

Linux 在bash别名$argv中自动转义IP地址,linux,sed,bash,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]$

我想设置一个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别名的最简单方法?

您需要的是一个函数,并且可以使用bash的内置替换语法:

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

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

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

$ function tryme() { echo "${1//./\.}"; }
$ tryme 1.1.1.1
1\.1\.1\.1
$ tryme "also. with ... spaces"
also\. with \.\.\. spaces
这将避免您分叉一个
sed
过程。

根据:

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

另外,
sed“s/$argv[1]/\\\\\./g”
如果将参数放在sed模式而不是输入字符串中,那么它实际上就没有意义了

那么,你会写:

function tryme() {
    echo "$(echo "$1" | sed "s/\./\\\\./g")"
}
或者,根据以下要求使用

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

另外,
sed“s/$argv[1]/\\\\\./g”
如果将参数放在sed模式而不是输入字符串中,那么它实际上就没有意义了

那么,你会写:

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

或者,使用
你真的能在这里使用
$argv
吗?可能不会。。。但是我应该使用什么呢?使用
grep-F
来避免
转义的需要?在别名中执行任何操作的最简单方法是使用函数。没有理由使用别名。
-w
选项有助于防止部分匹配。您真的可以在此处使用
$argv
吗?可能不会。。。但是我应该使用什么呢?使用
grep-F
来避免
转义的需要?在别名中执行任何操作的最简单方法是使用函数。没有理由使用别名。
-w
选项有助于防止部分匹配。+1。不知何故,我认为
${parameter/../…}
符号是BashV4+的一个特性(因此,不是每个人都有),但我只是在Bash3.2.25上尝试了它,它起了作用。很高兴知道!是的,连同
${parameter}…}
${parameter}…}
${parameter%…}
,…也非常有用。+1。不知何故,我认为
${parameter/../…}
符号是BashV4+的一个特性(因此,不是每个人都有),但我只是在Bash3.2.25上尝试了它,它起了作用。很高兴知道!是的,连同
${parameter#…}
${parameter##…}
${parameter%…}
,也非常有用。