Unixでは、sed 's / [^ 0-9] * / / g'コマンドはどういう意味ですか?

Unixでは、sed 's / [^ 0-9] * / / g'コマンドはどういう意味ですか?

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)

おすすめ記事