![パターン「^-0+([0-9]+)」は「^-0+([1-9]+)」と同じですか?](https://linux33.com/image/141708/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%80%8C%5E-0%2B(%5B0-9%5D%2B)%E3%80%8D%E3%81%AF%E3%80%8C%5E-0%2B(%5B1-9%5D%2B)%E3%80%8D%E3%81%A8%E5%90%8C%E3%81%98%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F.png)
Jeffは次のように書きました。負の名前のファイル名のパラメータ拡張エラー
[[ $b =~ ^-0+([0-9]+)$ ]] && b=-${BASH_REMATCH[1]}
この時点で最良の方向は、負の数になる可能性がある数字から前のゼロを削除するなどの操作を実行することです。
0
パターンの開始番号が必ず必要かどうか疑問に思います。つまり、^-0+([0-9]+)
パターンはと同じですか^-0+([1-9]+)
?ありがとうございます。
答え1
いいえ、^-0+([1-9]+)
そのような数字は一致しません-320
。
-320
編集:パターンをもう一度読むと、実際には不一致の2つの理由があります。
0
後ろには'がありません-
(+
必ずあるべきだと言います)。しかし、これは両方のモードの違いではなく、欠陥である可能性があります。0
ゼロ以外の最初の数字の後にはパターン間の違いがあります。
答え2
同じ文字列と一致するかどうかは、^-0+([0-9]+)
ロケールによって異なります。 C / POSIXロケールでは同じ文字列(および含む)と一致しますが、キャプチャする内容は異なる場合があります(たとえば、前者はからキャプチャし、後者はでキャプチャ)。^-0+([1-9]+)
$
-01foo
-00230bar
(...)
230
-00230bar
23
@Henrikが提案したように使用すると、$
同じ文字列では一致しません。^-0+([1-9]+)$
一致しません-00230
。
他の地域ではマイレージが異なる場合があります。たとえば、en_GB.UTF-8
Solaris 10システムのロケールでは、onは中間にソートされた文字であるため、一致するため、^-0+([0-9]+)
orは一致しますが、⓿または⓿は一致しません。-0⓿⓿12
⓿
0
1
[0-1]
[0-9]
^-0+([1-9]+)
0+
[1-9]
完全性のために/拡張sh
に依存せずに標準構文を使用してこれを行うには、次のようにします。bash
ksh93
case ${b#-0} in
("$b" | "" | *[![:digit:]]*) echo >&2 no match;;
(*) b=${b#"${b%%[!0-]*}"};;
esac
ここでの利点は[[:digit:]]
(とは対照的に[0-9]
)一致するだけです0123456789
。