sed + 如何删除第二个字符“.”从线上

sed + 如何删除第二个字符“.”从线上

如何删除第二个字符“.”从线

我所拥有的是这个(但它从输出中删除了第一个“.”

uname -r | sed s'/\./ /'

2 6.18-164.2.1.el5PAE

虽然我需要以下输出

2.6 18-164.2.1.el5PAE

答案1

只需将 N 添加到命令末尾即可匹配第 N 个匹配项,如下所示:

uname -r | sed 's/\./ /2'

你需要它做什么?


info页面sed

`s' 命令后面可以跟零个或多个以下标志:

G

Apply the replacement to _all_ matches to the REGEXP, not just the first.

数字

Only replace the NUMBERth match of the REGEXP.

答案2

.以下是从文件的一行中删除第二行的几种方法(它们会影响文件的所有行):

  1. sed。你已经有什么可能是最好的方法,但这是另一种方法:

    sed 's/\([^.]*\.[^.]*\)\./\1 /' file 
    

    这将查找最长的非.( [^.]*) 段,然后是.( \.),然后是下一段非 ( ) .,最后是.( \.)。括号捕获了模式,因此我们可以将其称为\1。因此,上面的命令只会删除第二个.并用空格替换。

    如果您有 GNU sed(Linux 上默认),您可以简化为:

    sed -r 's/([^.]*\.[^.]*)\./\1 /' file 
    
  2. Perl

    perl -pe 's/([^.]*\.[^.]*)\./\1 /' file 
    

    或者

    perl -F'\.' -ane 'print "$F[0].$F[1] ", join ".", @F[2..$#F]' file 
    
  3. awk(我确信有更好的方法)

    awk -F. '{printf "%s.%s ",$1,$2; for(i=3;i<NF;i++){printf "%s.",$(i); }print $NF}' file 
    

相关内容