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

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

我在查看 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

由以下组件组成。

  1. s/search_pattern/new_pattern/options- 替换(搜索和替换)
  2. [] - 正则表达式。
  3. * - 0 次或多次出现的通配符。
  4. 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)了解更多信息。

相关内容