\{x,y\}
たとえば、inがsed
できるだけ多くの文字または少ない文字と一致しようとするかどうかを知りたいと思います。
また、誰かが次の予期しない動作を私に説明できますかsed
?
echo "baaab" | sed 's/a\{1,2\}//'
bab
echo "baaab" | sed 's/a\{0,2\}//'
baaab
最初の行ではsed
欲があり、2行目では当然ではありませんが、理由はありますか?
私はGNU sedバージョン4.2.1を使用しています。
答え1
a\{0,2\}
行の先頭の空の文字列と一致します(実際には空の文字列ですがg
指定されていません)。
$ echo "baaab" | sed 's/a\{0,2\}/y/'
ybaaab
GNUはsed
左から右に一致し、グローバル置換が指定されていないため、行の先頭のみが一致します。以下を使用した場合g
:
$ echo "baaab" | sed 's/a\{0,2\}/y/g'
ybyyby
先頭と末尾の空の文字列と残りの部分aa
と一致しますa
。
答え2
はい、貪欲です。
POSIX互換システムでは、sed
使用されるすべてのツールだけでなく、基本正規表現、これ一致するパターンは常に貪欲です。:
一致するシーケンスの検索は、文字列の先頭から始まり、式に一致する最初のシーケンスが見つかると停止します。ここで、「first」とは、「文字列で最も早い開始」を意味するように定義される。パターンが一致する文字の可変数を許可するため、その時点で始まるこれらのシーケンスが複数ある場合、最長シーケンスと一致。たとえば、BRE "bb *"は文字列 "abbbc"の2番目から4番目の文字に一致し、ERE "(wee|week)(knights|night)"は "weeknights"文字列の10文字すべてに一致します。します。
完全一致が最も左の一致のうち最も長いものと一致するように、各サブパターンは左から右にできるだけ長い文字列と一致する必要があります。この目的のために、空の文字列はまったく一致しないよりも長いものとして扱われるべきです。。たとえば、BRE "(。)。”は“abcdef”と一致し、サブ式 “(\1)”は“abcdef”、“bc” BRE “(a*)*”と一致し、サブ式 “(\1)”は空の文字列です。
このパターンは0から2の間のすべての文字と一致しますa\{0,2\}
。a
ゼロ回の発生は、上記の仕様で一致しない長さより長いと見なされる空の文字列を意味します。
使用法の問題は、代替コマンドg
のグローバルフラグを使用しないことですsed
s
。ローカルフラグがない場合、g
最初の一致(行の先頭の空の文字列)が見つかるとすぐに置換が停止しますsed
。s
一般的な形式は\{m,n\}
with0 <= m <= n <= RE_DUP_MAX
で、ほとんどのプラットフォームでは次のようRE_DUP_MAX
になります。32767
$ getconf RE_DUP_MAX
32767