0

ディレクトリ内のすべてのログを自動的にgrepするようにbashエイリアスを設定したいと思います。ただし、これをユーザーフレンドリーにするために、ピリオドをエスケープして空白の境界を追加し、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

エコーが検索されないことはわかっていますが、これは簡単なテストでした。

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 に答える