私はこれを理解しようとしています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