[英]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
過程。
沒有像
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.