次のテキストがあります。
1234
正規表現を使用して、最初の数字(この場合は1)を除くすべての数字を選択したいと思います。したがって、パターンが選択された。
234
どうすればいいですか?変数は使用できず、正規表現のみを使用できます。そして、最初の数字も削除できません。最初の数字を除くすべての文字列を選択する正規表現は1つだけです。
答え1
文字列引数に正規表現を適用する標準コマンドは、対応するexpr
演算子を使用することです:
。標準を理解する基本正規表現。正規表現が一致するかどうかに応じて 1 または 0 を出力します。ただし、正規表現に複数のキャプチャグループがある場合は、最初のキャプチャグループと一致する項目を出力します。expr
の1つの特徴:
は、正規表現がまるで始まるかのように暗黙的に先頭に固定されることです^
。だから:
text=1234
expr "x$text" : "x.\(.*\)"
テキストと正規表現の両方に(任意に)プレフィックスを付けます。それ以外の場合は、x
内容が正確に演算子である場合、または少なくとも一部の演算子である場合、コマンドは失敗し、実装によってはこれらの演算子に問題がある可能性があります。例:$text
expr
expr
$ 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}
前の部分が削除された内容と一致するように拡張される場所です。$var
pattern
答え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