我正在浏览一个 Unix shell 脚本,在那里我遇到了这个命令:
sed 's/[^0-9]*//g'
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
Kus*_*nda 11
命令
sed 's/[^0-9]//g'
Run Code Online (Sandbox Code Playgroud)
就像一个过滤器,只允许数字通过。
所以会
sed 's/[^0-9]*//g'
Run Code Online (Sandbox Code Playgroud)
但由于g最后,*不需要(在最后更多)。
正则表达式的[^0-9]意思是“任何不是数字的字符”,sed命令的s/[^0-9]//g意思是“用空替换任何非数字字符,然后在每一行输入(即不仅仅是第一个非数字)上重复尽可能多的次数在每一行)”。
例子:
$ echo '1-2 1-2? Is this mic on? Hello world! It is 2018!' | sed 's/[^0-9]//g'
12122018
Run Code Online (Sandbox Code Playgroud)
它与命令相同
tr -dc '0-9\n'
Run Code Online (Sandbox Code Playgroud)
它还删除其输入中的非数字(并单独留下换行符)。
[^0-9]和之间的区别在于[^0-9]*前者只匹配一个非数字字符,而后者匹配零个或多个非数字字符。如果你想删除非数字,你不想匹配空字符串(上面“零或更多”中的“零”),所以匹配[^0-9]比匹配更有意义[^0-9]*。
命令g末尾的标志sed表示“全局”,即行上的任何地方,而不仅仅是第一个匹配项。删除这个,你会注意到
$ echo '123 testing' | sed 's/[^0-9]*//'
123 testing
Run Code Online (Sandbox Code Playgroud)
匹配 , 前面的空白区域1,不替换任何内容。一个更直观的例子:
$ echo '123 testing' | sed 's/[^0-9]*/(&)/'
()123 testing
Run Code Online (Sandbox Code Playgroud)
...g最后:
$ echo '123 testing' | sed 's/[^0-9]*/(&)/g'
()1()2()3( testing)
Run Code Online (Sandbox Code Playgroud)
然后我们有
$ echo '123 testing' | sed 's/[^0-9]//'
123testing
Run Code Online (Sandbox Code Playgroud)
它匹配并替换空格,这是一个非数字。一个更直观的例子:
$ echo '123 testing' | sed 's/[^0-9]/(&)/'
123( )testing
Run Code Online (Sandbox Code Playgroud)
...g最后:
$ echo '123 testing' | sed 's/[^0-9]/(&)/g'
123( )(t)(e)(s)(t)(i)(n)(g)
Run Code Online (Sandbox Code Playgroud)