Unix シェル: 正規表現を含む部分文字列

Unix シェル: 正規表現を含む部分文字列

次のテキストがあります。

1234

正規表現を使用して、最初の数字(この場合は1)を除くすべての数字を選択したいと思います。したがって、パターンが選択された。

234

どうすればいいですか?変数は使用できず、正規表現のみを使用できます。そして、最初の数字も削除できません。最初の数字を除くすべての文字列を選択する正規表現は1つだけです。

ベストアンサー1

文字列引数に正規表現を適用する標準コマンドは、対応するexpr演算子を使用することです:。標準を理解する基本正規表現。正規表現が一致するかどうかに応じて 1 または 0 を出力します。ただし、正規表現に複数のキャプチャグループがある場合は、最初のキャプチャグループと一致する項目を出力します。exprの1つの特徴:は、正規表現がまるで始まるかのように暗黙的に先頭に固定されることです^。だから:

text=1234
expr "x$text" : "x.\(.*\)"

テキストと正規表現の両方に(任意に)プレフィックスを付けます。それ以外の場合は、x内容が正確に演算子である場合、または少なくとも一部の演算子である場合、コマンドは失敗し、実装によってはこれらの演算子に問題がある可能性があります。例:$textexprexpr

$ text='('
$ expr "$text" : ".\(.*\)"
expr: syntax error: expecting ')' instead of ‘.\\(.*\\)’
$ expr "x$text" : "x.\(.*\)"

$ text=index
$ expr "$text" : ".\(.*\)"
0
$ expr "x$text" : "x.\(.*\)"
ndex

最初の文字はキャプチャグループ内にないため、.出力されない最初の文字と一致します。$text次に、残り.*のゼロ文字以上をキャプチャして、出力にできるだけ多く使用します。

$text正規表現が一致しない場合(空であるか文字として解釈できない項目で始まる場合)、または出力が数値の場合(実装によって異なる値が異なる0場合)、終了ステータスは0ではありません。 、...exprなどのスペルまたは空の文字列です。00-0

exprただし、とにかくこのために正規表現を実行したり使用したりする必要はありません。標準シェル引数拡張演算子は、次のことを行います。

text=1234
printf '%s\n' "${text#?}"

${var#pattern}前の部分が削除された内容と一致するように拡張される場所です。$varpattern

おすすめ記事