正規表現 - 端末でコマンドが見つかりません。

正規表現 - 端末でコマンドが見つかりません。

キャッチしようとしています。私の名前369file.txtでこの行を正規表現でgrepしましたが、エラーが返されました。を試してみましたが、egrep成功しませんでした。

入力する:

  1. 私の名前369 ==一致
  2. 私の名前161 ==一致
  3. my_name 123 2 !=エラー

間違い: ?!.: command not found

これは私が実行したいコードで、うまくいきます。正規表現 101

grep -i "^\s*my_name\s+[0-9]+\s*$(?!.)*" file.txt

答え1

あなたが望むようです:

grep -Ex '[[:space:]]*my_name[[:space:]]+[0123456789]+[[:space:]]*' file.txt
  • 二重引用符内では、という$(cmd)出力に展開されますcmdコマンドの置き換えまだ実行中です。ここでは?!.コマンドの出力を取得しようとしますが、コマンドが存在しないためエラーが発生します。多くの正規表現演算子がシェルでも特別な意味を持つのでエスケープされるので、一重引用符を使用して引用するのが最善です。すべてシェル文字。
  • \sそして(?!.)真珠正規表現演算子。現在、一部のgrep実装ではこれをサポートしていますが\s(標準の略で)、70年代初頭に導入されて以来、リテラル一致が必要なため、否定予測演算子を[[:space:]]サポートできません。標準のERE(拡張正規表現)が指定されていないため、これを識別するために(90年代初頭にPOSIXによって導入された)を使用できます。 ast-openの実装はこれを行いますが、これが私が知っている唯一のものです。いずれにせよ、後でアイテムを追加することは意味がありません(トピックの終わりに一致するように意図されています)。また、(あなたの場合)ツアー演算子の後に数量子を追加することも意味がありません。(?!.)(?!(?!grep-E(?...Egrep$*
  • +BRE 演算子ではなく、ERE または Perl RE 演算子です。 BREに該当するのは\{1,\}
  • [0-9]0123456789 ASCII アラビア語の数字と一致しますが、通常は正確に 0 から 9 の間にソートされるより多くの (通常は数字関連) 文字があります。 (入力検証を実行するときなど)0123456789のみを一致させる場合は、正確なリストを指定する必要があります。
  • -xライン全体に合わせて追加すると、アンカーポイント^を使用する手間が省けます$
  • -i大文字と小文字を区別しない一致に使用されます。それでMY_NAMEMy_NaMeも受け入れられます。
  • タイピングが装飾的なものより短いので、-E上で使用しました。ここで ERE を必ずしも使用する必要はありません。+\{1,\}
  • doのいくつかの実装は、マッチングのためにPerlと同様の正規表現を使用するオプションをgrepサポートしています。-Pこれであなたはそれを行うことができますgrep -Px '\s*my_name\s+\d+\s*'\d10進数と一致するように設計されています。私が試したGNUバージョンはgrep0123456789とのみ一致しますが、これがすべてのバージョンと実装に適用されることを保証することはできません。たとえば、grep -Px '(*UCP)\d'UニコードC文字プロパティの場合)、さらにP10進文字を一致させる方法をご覧ください。[0123456789]安全のためにまだそこで使用したいかもしれません。

もう一つの方法は、次を使用しawkて実行することです。

awk 'NF == 2 && $1 == "my_name" && $2 ~ /^[0123456789]+$/'

Nより明確にするには、2つのフィールド(フィールド数が2の場合)がある行が必要ですF。最初のフィールドはmy_nameで、2番目のフィールドはASCII 10進数でのみ構成されています。デフォルトでは、フィールドは空白(と同様[[:blank:]])で区切られていますが、一部の実装ではスペースとawkタブのみを考慮し、一部は[[:space:]]/ \sdoなどの垂直方向の間隔文字も考慮します。

大文字と小文字を区別しない一致の場合は、次のようにしますtolower($1) == "my_name"。 GNU実装をawk渡すことで、すべての正規表現一致に対して大文字と小文字を区別しない一致を実行できます-v IGNORECASE=1


1 技術的には?!.シェルグローブであり、?グローブ演算子でもあります。a!.したがって、現在の作業ディレクトリに呼び出されたファイルがある場合、b!.そのファイルはそのファイルに展開され、引数でa!.コマンドを実行しようとします。b!.zshやFish(のオプションを参照failglob)などのより正常なシェルを使用すると、一致するファイルがbashないとエラーが発生します。?!.

関連情報