我在查看 Unix shell 脚本时遇到了这个命令:
sed 's/[^0-9]*//g'
有人可以解释一下吗?
答案1
命令
sed 's/[^0-9]//g'
就像一个过滤器,只允许数字通过。
所以会
sed 's/[^0-9]*//g'
但由于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
和命令是一样的
tr -dc '0-9\n'
它还会删除输入中的非数字(并且也保留换行符)。
[^0-9]
和 的区别在于[^0-9]*
,前者只匹配一个非数字字符,后者匹配零个或多个非数字字符。如果你想删除非数字,您不想匹配空字符串(上面“零或更多”中的“零”),因此匹配[^0-9]
比匹配更有意义[^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)
答案2
sed 's/[^0-9]*//g'
意思是删除非数字字符。
例子
echo alsal34las | sed sed 's/[^0-9]*//g'
将会得到34
如果你想了解更多,我建议你看看正则表达式。
答案3
直接回答——它搜索字母数字文本中每次出现的数字并将其删除。
解释 -
sed 's/[^0-9]*//g' filename
由以下组件组成。
s/search_pattern/new_pattern/options
- 替换(搜索和替换)[]
- 正则表达式。*
- 0 次或多次出现的通配符。g
- 全局(一个选项 - 替换该行中的每个出现位置)
让我们了解每个组件
1. sed 's/search_pattern/new_pattern/options' 文件名
sed 's/akshat/saxena/' file.txt
这会在每一行中搜索模式“akshat”,并仅将其第一次出现替换为名为 file.txt 的文件中的“saxena”
在这里,我们可以给出 g(全局)、i(忽略大小写) 等选项
(i) g(global)
Discussed in point 4.
(ii) i - searches ignoring case (case- insensitive search)
sed ' s/life/love/i' file.txt
Replace life/Life/lIfe/liFe/life/lifE (and many more) with love
2.使用[]的正则表达式
在正则表达式中,可以搜索不同的值组合或范围。
sed 's/[Li][Ii][Ff][Ee]/love/g' file
表示模式具有 L 或 l,后跟 I 或 i,后跟 F 或 f,后跟 E 或 e。因此,它成为不区分大小写的搜索。
如果需要范围,则使用破折号(-)。 [az] 表示小 a 到 z,即所有字母字符。 [0-9] 表示 0 到 9,即所有数字字符。
所以在给定的代码中,它指的是搜索所有数字字符。
3.*
任何角色都可以代替它。因此,在给定的代码中,任何字符都可以遵循正则表达式 [0-9]
4.g(全局)
replace all occurrence in that line.
Inorder to replace first occurence in particular line use
sed 'ns/akshat/$$/' 文件
where n is the line number.
上面的代码将第 n 行中的模式“akshat”替换为 $$。
答案4
当然,
sed 's/[^0-9]*//g
sed
是“流编辑器”,用于放置在管道 ( ) 的末尾|
、重定向(例如<<<
,如 中那样sed 's/[^0-9]*//g' <<< 'yourstring123'
,或直接在文件上使用(即sed 's/[^0-9]*//g' /your/filename
)。
sed 中的命令s
指的是“替换”,用于替换字符:
$ sed 's/pattern/replacment/' <<< 'pattern123pattern'
replacement123pattern
g
末尾的修饰符表示“全局”,用于替换整行:
$ sed 's/pattern/replacement/g' <<< 'pattern123pattern'
replacement123replacement
[^0-9]*
是一个正则表达式,这就是这个命令的神奇之处。
[: begin matching
^: NOT these characters:
0-9: 0 through 9
]: end match
*: match 0 or more occurances
例如,[^0-9]*
将匹配 0 到 9 范围内的任何非数字:
sed 's/[^0-9]*//g'
:用空字符串('')替换所有非数字字符。
$ sed 's/[^0-9]*//g' <<< 'pattern123pattern'
123
$ sed 's/[^0-9]*//g' <<< '123qwertyui456opasdfghjklzxcvbnm789,./;[]=`~012+:"{}<>?345'
123456789012345
请参阅 mansed(1)
和regex(7)
了解更多信息。