AWKで正規表現の欲を減らすには?

AWKで正規表現の欲を減らすには?

私はこれを理解しようとしていますawk。例は次のとおりです。

echo "@article{gjn, Author =   {Grzegorz J. Nalepa}, " | awk '{ sub(/@.*,/,""); print }'

短い文字列を選択する正規表現を作成できますか?

@article{gjn,

この長い文字列の代わりに? :

@article{gjn, Author =   {Grzegorz J. Nalepa},

私はこの結果を得たいと思います:

 Author =   {Grzegorz J. Nalepa},



別の例があります。

エコ」記事 {gjn, 著者 = {Grzegorz J. Nalepa}, " | awk '{ sub(/[^,]*,/,"");印刷}'
      ↑^^^^^^

入力文字列と正規表現の最初の位置にある文字を@コンマ()文字に変更しました。短い文字列を選択する正規表現を作成できますか?,.*[^,]*

, Author =   {Grzegorz J. Nalepa},

長い文字列の代わりに? :

,article{gjn, Author =   {Grzegorz J. Nalepa},

私はこの結果を得たいと思います:

,article{gjn

ベストアンサー1

これ以降の@最初の項目を選択するには、,次のように指定する必要があります。@[^,]*,

その後にはカンマではなく@数字()が続き、その後にコンマ()が続きます。*[^,],

この方法は同じように機能しますが、後に続く内容が1つ以上の文字であるため、@.*?,同様の操作では機能しません。@.*?stringキャラクターを否定するのは簡単ですが、正規表現で文字列を否定することははるかに困難です。

別のアプローチは、入力を前処理して、string入力に現れない文字に置き換えるか、または前に追加することです。

gsub(/string/, "\1&") # pre-process
gsub(/@[^\1]*\1string/, "")
gsub(/\1/, "") # revert the pre-processing

入力に代替文字(\1上記)が含まれていないことを保証できない場合、1つのアプローチはエスケープメカニズムを使用することです。

gsub(/\1/, "\1\3") # use \1 as the escape character and escape itself as \1\3
                   # in case it's present in the input
gsub(/\2/, "\1\4") # use \2 as our maker character and escape it
                   # as \1\4 in case it's present in the input
gsub(/string/, "\2&") # mark the "string" occurrences

gsub(/@[^\2]*\2string/, "")

# then roll back the marking and escaping
gsub(/\2/, "")
gsub(/\1\4/, "\2")
gsub(/\1\3/, "\1")

これは固定sでは機能しますが、任意の正規表現stringでは機能しません。@.*?foo.bar

おすすめ記事