2016-09-28 6 views
0

のための正規表現をgawkは:は、私は次の式のためのgawkを用いたパターンに一致するようにしようとしていたパターン

static char *nm = "This is a test with many characters like [email protected]#^&"; 

次のようにパターンがある:

1. Line starts with static 
2. 0 or more number of characters including whitespaces 
3. char 
4. 0 or more number of characters including whitespaces 
5. = 
6. 0 or more number of characters including whitespaces 
7. " 
8. 0 or more number of characters including whitespaces 
9. " 
10. 0 or more number of characters including whitespaces 
11. ; 

私はgawk /^static.*char.*=.*\",*\";"/{print} にしようとしています私は、最初に一致したパターンの後に "bbbbb"を含む行を挿入しようとしています:

gawk '1; $1==nm1 && ++a==1 {print nm2}' nm1="^static.*char.*=.*\",*\";" nm2="bbbbb" "aa" 

静的なchar * nm = "これは$ @#^ &のような多くの文字を使ったテストです。これはそのままの状態です。

助けてください。

+0

'&'のためには何ですか?また、引用符の近くに '。*'の代わりに '、*'を付けて、最後に余分な引用符を付けることもできます。 '/ *。*"。*;/{print} '' – 123

+0

試してみてください: '/^static.*char.*=.*"[^"]*" ;/{print} ' – anubhava

+0

@anubhavaは、一致したパターンの後にパターンを挿入するという要件を持つQを編集しました –

答えて

1

$1==nm1は、レコード全体ではなく、$1の文字列等価性テストのみを実行するため、正規表現は適用されません。

あなたは、このawkコマンドを使用することができます

:あなたは引数を使用して正規表現を渡したい場合は、使用

awk -v nm2="bbbbb" '1; !p && /^static.*char.*=.*"[^"]*";/{p++; print nm2}' file 

を:。

awk -v nm2="bbbbb" -v nm1='^static.*char.*=.*"[^"]*";' '1; !p && $0 ~ nm1{p++; print nm2}' file 
+0

しかし、静的な文字が最初に出現した後にbbbbを入れたい場合* nm ="これは、何か他のものではないでしょうか? –

+1

その場合は、次のようにしてください: 'awk -v nm2 =" bbbbb "-v nm1 = '^ static。* char。* =。*" [^ "] * "; ' '1; !p && $ 0〜nm1 {p ++; print nm2} 'ファイル' – anubhava

+0

はい、多くのありがとう –

関連する問題