egrepを使用して行のみを印刷する

egrepを使用して行のみを印刷する

初期化なしでint型の単一C変数定義で構成された行を印刷します。前にはオプションで符号がなく、その後に // コメントが 1 行で表示されます。

使っています

egrep "^int.*[a-zA-Z0-9].*[^=].*;|^ unsigned int.*[a-zA-Z0-9].*[^=].*;" myfile.txt

それは印刷する

int x=9;
int dftr2;

印刷されませんが、

int x;

印刷しないでください。

int x=9;

myfile.txt の内容です。

int x;
int x=9;
int dftr2;
unsigned int dftrxe2;
unsigned int w=1;

egrepを使用する必要があります。

答え1

あなたの質問を文字通り受け入れる(不完全な答えに基づいて自分自身を制限しないでください)、正しい答えは次のとおりです。

egrep '^\s*(unsigned\s+)?int\s+[_A-Za-z][_A-Za-z0-9]*\s*;\s*(//.*)?$' myfile.txt

ステップバイステップ:

  • ^検索を行の先頭に固定します。
  • \s*宣言の前の行の先頭には、空白文字(スペースまたはタブ)がいくらでも許可されます。
  • (unsigned\s+)?「符号なし」が0個または1個発生することを許可します。
    • 存在する場合、そのあとに以上スペース - \s+
  • int\s+1つ以上のスペースが後に続く「int」キーワードと一致します。
  • [_A-Za-z]- C変数名の最初の文字は文字またはアンダースコア(_)でなければなりません。
  • [_A-Za-z0-9]*—C 変数名の次の文字は文字、下線、または数字。これには任意の数字があります(0を含む私たちは何を議論していますか次のように最初の文字)。
    • (一部のCコンパイラは最大識別子の長さを指定できます。標準でこれを行うかどうか覚えておらず、あえて探していません。)
  • \s*スペースはいくらでも許可してください...
  • …前に;
  • \s*必要なだけ空白を許可します。後ろにセミコロン。
  • (//.*)?- オプションで//コメントを許可します。
  • $行末までアンカー検索を実行します。

したい場合はできます。

  • \sまたはに変更してください[[:space:]][SpaceTab]
    • キーボードでこれを入力した場合は、コマンドラインに実際のタブ文字をインポートする前にCtrk+と入力する必要があります。 (もちろんスクリプトを書く場合は問題になりません。)VTab
  • 、および/または[_A-Za-z]で置き換え[_[:alpha:]]
  • [_A-Za-z0-9]*使用。 。 。交換[_[:alnum:]]

反例:

これ

egrep '^(unsigned )?int [^=]*;' myfile.txt

他の回答に示されているコマンドは、次の行を印刷します。

int a, b;               // Multiple variables declared.
int c; int d;           // Multiple “int” declarations.
int e; float f;         // Multiple declarations where only the first is an “int”.
int g[9];               // Array.
int *h;                 // Pointer.
int func();             // Function.
int 3D;                 // Illegal variable name.
int 42;                 // Not even an illegal variable name.

(印刷しないでください)次の行をスキップしてください。

  int s;                // Space(s) at the beginning of the line.
int     t;              // Tab after “int”.
unsigned  int u;        // Multiple spaces after “unsigned”.
unsigned        int v;  // Tab after “unsigned”.

(印刷する必要があります)。

答え2

int次から始めるか、次にunsigned int終わるが;次を含まないステートメントを含む行を見つけます=

$ egrep '^(unsigned )?int [^=]*;' myfile.txt
int x;
int dftr2;
unsigned int dftrxe2;

=これはコメントにも適用され、その中のすべての内容は正しく無視されます。次のテストファイルを検討してください。

$ cat myfile2.txt
int y; // y=height
int z=1; // z is depth

結果は次のとおりです。

$ egrep '^(unsigned )?int [^=]*;' myfile2.txt
int y; // y=height

最後に使用されなくなったことに注意してくださいegrepgrep -E好ましい:

grep -E '^(unsigned )?int [^=]*;' myfile.txt

答え3

初期化されたことを示すエントリを検索または除外するintunsigned int=操作が実行されるように見えます。

grep -E '^int|^unsigned int' myfile.txt | grep -Ev '='

関連情報