bash スクリプトで =~ を使用して正規表現 ^#.*${new_user} を照合する方法は?

bash スクリプトで =~ を使用して正規表現 ^#.*${new_user} を照合する方法は?

タイトルには基本的にすべての内容が記載されていますが、生涯を把握することはできず、bash正規表現の一致によって混乱します。これはif私のbashスクリプトの説明ですが、常にその行と一致します${new_user}# ${new_user}デフォルトでは、「コメント付き」ユーザーと一致させたいと思います。

if [[ $(<"foo.txt") =~ \#.*${new_user} ]]; then

答え1

このパターンでは、正規表現を使用せずにglob式のみを使用する方がはるかに簡単です。これは^#.*${new_user}あなたの質問と同じです。

% new_user=foo
% [[ '# somethingfoo' == '#'*"${new_user}"* ]]; echo $?
0
% [[ '# somethingbar' == '#'*"${new_user}"* ]]; echo $?
1

質問の片側にのみ固定しているので、次の文字を一致させようとしているように聞こえます$new_user。本当に端に固定したい場合は削除してください*

Bashで正規表現を使用することは確かに可能ですが、人間工学と銃撃戦はかなり厄介です。可能であれば、地球や他のメカニズムを使用することをお勧めします。

正規表現を必ず使用する必要がある場合、使用方法は次のとおりです(${new_user}正規表現文字を含む場合は引用することが唯一の違いです)。

$ [[ '# somethingfoo' =~ ^#.*"${new_user}" ]]; echo $?
0
$ [[ '# somethingbar' =~ ^#.*"${new_user}" ]]; echo $?
1

繰り返しますが、最後にアンカーを追加するには$


^複数行の文脈で意味を誤解する可能性があります。 Bash では、^行の先頭ではなく文字列の先頭と一致します。何かがあるかどうかを確認するために各行を調べる必要がある場合、if grep ...; thenまたは次のループを使用してください。

found=0
while IFS= read -r line || [[ $line ]]; do
    if [[ "$line" == '#'*"${new_user}"* ]]; then
        found=1
        break
    fi
done < foo.txt

# do something with $found

最後に改行文字がないファイルに興味がない場合は、確認を省略できます[[ $line ]]

関連情報