簡體   English   中英

在bash別名$ argv中自動轉義IP地址

[英]Auto-escaping an IP address in bash alias $argv

我想設置一個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

我意識到回聲不會被搜索到,但這是一個簡單的測試。

在bash別名的參數中轉義句點的最簡單方法是什么?

您想要的是一個函數,您可以使用bash的內置替換語法:

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

這將避免您分叉sed過程。

根據Bash參考手冊的第6.6節“別名”

沒有像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")"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM