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

答え2

テキストがファイルにあると仮定すると、file次のsedコマンドはファイル内の各行の最初の数字を削除し、結果を印刷します。

sed 's/[[:digit:]]//' file

テスト:

$ cat file
123
1234
alpha123
a1b2c3
$ sed 's/[[:digit:]]//' file
23
234
alpha23
ab2c3

文字列が変数にある場合、実際に正規表現は必要ありません。十分だろう

${string/[[:digit:]]/}

存在するbash

$ string=alpha123
$ printf '%s\n' "${string/[[:digit:]]/}"
alpha23

最初の位置に表示される番号のみを削除するには、標準パラメータ置換を使用できます。

${string#[[:digit:]]}

良い

$ string=1234
$ printf '%s\n' "${string#[[:digit:]]}"
234

関連情報