grep "^$1"
一種の操作ですが、"$1"
grepがその文字を具体的に解釈しないようにエスケープするにはどうすればよいですか?
それとももっと良い方法がありますか?
編集する:
検索したくないが'^$1'
行の先頭にある場合にのみ一致する必要がある動的に挿入された固定文字列。それが私の言葉の意味です$1
。
答え1
一致するものがあることを確認する必要がある場合は、すべての入力行を必要なプレフィックス$1
()の長さに切り取り、固定パターンgrepを使用します。
if cut -c 1-"${#1}" | grep -qF "$1"; then
echo "found"
else
echo "not found"
fi
一致する行数を取得するのも簡単です。
cut -c 1-"${#1}" | grep -cF "$1"
または、一致するすべての行の行番号(行番号は1から始まります):
cut -c 1-"${#1}" | grep -nF "$1" | cut -d : -f 1
行番号を入力しhead
てtail
一致する行の全文を取得できますが、PythonやRubyなどの最新のスクリプト言語を使用する方が簡単です。
(上記の例では、Posix grepとcutを想定しています。検索中のファイルが標準入力から来ていると仮定していますが、ファイル名を使用するように簡単に変更できます。)
$1
編集:また、パターン()が長さ0の文字列ではないことを確認する必要があります。それ以外の場合はcut
話せませんvalues may not include zero
。また、Bashを使用している場合は、set -o pipefail
エラー終了をキャッチするために使用しますcut
。
答え2
バックスラッシュを尊重するPerlの使い方
v="$1" perl -ne 'print if index($_, $ENV{"v"} )==0' file
これはコマンドの環境変数vを設定し、その変数のインデックスが0(つまり行の先頭)かどうかを印刷します。
awkでも同じことができます。
v="$1" awk 'index($0, ENVIRON["v"])==1' file
答え3
grep
それ自体が正規表現の一部です。を使用してこれを行う方法を考えることはできないため、^
これを使用するには正規表現を解釈する必要があります。部分文字列のマッチングawk
や他の方法を使用するのは簡単ですperl
。
awk -v search="$1" 'substr($0, 1, length(search)) == search { print }'
埋め込み検索文字列を処理するには、\
次のトリックを使用できます。123件の回答:
search="$1" awk 'substr($0, 1, length(ENVIRON["search"])) == ENVIRON["search"] { print }'