Unixシェルスクリプトを見ていましたが、次のコマンドが見つかりました。
sed 's/[^0-9]*//g'
誰かがこれを説明できますか?
ベストアンサー1
注文する
sed 's/[^0-9]//g'
数字だけを通過させるフィルタと同じです。
だからそうだろう
sed 's/[^0-9]*//g'
g
しかし、最終的には*
そうする必要はありません(詳細は次のとおりです)。
正規表現は[^0-9]
「数字以外のすべての文字」を意味し、sed
コマンドはs/[^0-9]//g
「数字以外の文字をnullに変更し、各入力行でできるだけ繰り返す(つまり、数字以外の最初の文字だけでなく)を意味します。 )一行)」。
例:
$ echo '1-2 1-2? Is this mic on? Hello world! It is 2018!' | sed 's/[^0-9]//g'
12122018
命令語と同じです。
tr -dc '0-9\n'
また、入力から数字以外の文字を削除します(そして改行文字も保存します)。
[^0-9]
との違いは、[^0-9]*
前者は1つの数字以外の文字と一致し、後者がゼロ以上の数字以外の文字と一致することです。欲しいなら数値ではなく数値を削除、空の文字列(上記の「0個以上」の「0」)と一致することを望まないので、[^0-9]
matchする方が合理的です[^0-9]*
。
g
コマンドの最後にあるフラグはsed
「グローバルに」を意味します。つまり、最初の発生だけでなく、行のすべての位置を意味します。これを削除するとわかります
$ echo '123 testing' | sed 's/[^0-9]*//'
123 testing
先行スペースと一致し、1
何も置き換えません。より直感的な例:
$ echo '123 testing' | sed 's/[^0-9]*/(&)/'
()123 testing
...g
ついに:
$ echo '123 testing' | sed 's/[^0-9]*/(&)/g'
()1()2()3( testing)
だから私たちは
$ echo '123 testing' | sed 's/[^0-9]//'
123testing
数字ではなく空白と一致し、置き換えられます。より直感的な例:
$ echo '123 testing' | sed 's/[^0-9]/(&)/'
123( )testing
...g
ついに:
$ echo '123 testing' | sed 's/[^0-9]/(&)/g'
123( )(t)(e)(s)(t)(i)(n)(g)