行の先頭にgrepを固定文字列

行の先頭にgrepを固定文字列

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

行番号を入力しheadtail一致する行の全文を取得できますが、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 }'

答え4

grepに-Pオプションがある場合、これは次のことを意味します。ポリメラーゼ連鎖反応、次のようにすることができます。

grep -P "^\Q$1\E"

これを参照してください質問と見るPCRE文書必要に応じて詳細をご覧ください。

関連情報