0

私はクラスで過去数日間、正規表現を扱ってきました。この式が機能しない理由を特定できません。次のような表現を探しています。

value = (struct node){ 5, NULL};
value2 = (structname){ 1, 2 }; 
*pointer = ( bla ){3,4};

私が使用している表現は次のとおりです。

sed -n '/^[*0-9A-Za-z_]+ *= *( *[0-9A-Za-z_]+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]};/p'     structfile

何も返さないので、何が欠けていますか。また、いくつかの式で [^,] を使用しましたが、まだ , s の行が表示されます。私は何が欠けていますか?

4

2 に答える 2

1

これはうまくいくかもしれません(GNU sed):

sed '/^\S\+\s\+=\s\+(\s*\S\+\(\s\+\S\+\)\?\s*){\s*\S\+\s*,\s*\S\+\s*};/!d' file
  • \s空白 ( )、非空白 ( ) 、および\Sリテラル ( =()、)のみを使用して緩やかな正規表現を作成することから始めます。{};
  • 上記が 1 以上、0 以上、0 または 1 のいずれであるかを判断します。たとえば、1 つ以上の\s\+空白は\S*グループ化されます\(\s\+\S\+\)\?
  • ^文字列の開始、文字列の$終了、および\n改行の複数行の正規表現を使用して正規表現を固定してみてください
  • 左から右にゆっくりと正規表現を作成し、各部分を確認しながら進めていきます
  • 作業バージョンを取得したら、個々の空白/非空白をより具体的な文字クラスに置き換えます
  • 1 つまたは複数のクラスを特定の範囲または数 (1 対 3 ( \{1,3\}) または 3 ( \{3\}) など) にさらに絞り込みます。もちろん、単一のクラス、リテラル、またはグループを修飾する必要はありません。

HTH

于 2012-09-27T05:57:58.617 に答える
1

エスケープする必要があり+ます。に固定{[0-9A-Za-z, ]}{[0-9A-Za-z, ]*}ます。

sed -n '/^[*0-9A-Za-z_]\+ *= *( *[0-9A-Za-z_]\+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]*};/p' structfile


me@localhost:~$ cat structfile 
value = (struct node){ 5, NULL};
value2 = (structname){ 1, 2 }; 
*pointer = ( bla ){3,4};
not astruct
notastructstr =

me@localhost:~$ sed -n '/^[*0-9A-Za-z_]\+ *= *( *[0-9A-Za-z_]\+ *[0-9A-Za-z_]* *) *{[0-9A-Za-z, ]*};/p' structfile
value = (struct node){ 5, NULL};
value2 = (structname){ 1, 2 }; 
*pointer = ( bla ){3,4};
于 2012-09-27T03:20:59.477 に答える