初期化なしで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
最後に使用されなくなったことに注意してくださいegrep
。 grep -E
好ましい:
grep -E '^(unsigned )?int [^=]*;' myfile.txt
答え3
初期化されたことを示すエントリを検索または除外するint
とunsigned int
、=
操作が実行されるように見えます。
grep -E '^int|^unsigned int' myfile.txt | grep -Ev '='