sed 's/[^0-9]*//g' 命令在 unix 中是什么意思?

pur*_*mar 2 sed

我正在浏览一个 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)