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' может следовать ноль или более из следующих ФЛАГОВ:

г

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 
    

    Это будет искать самый длинный отрезок не- .( [^.]*), затем a .( \.), затем следующий отрезок не- .и, наконец, a .( \.). Скобки фиксируют шаблоны, поэтому мы можем ссылаться на него как \1. Таким образом, команда выше просто удалит второй .и заменит его пробелом.

    Если у вас GNU sed(по умолчанию в Linux), вы можете упростить это до:

    sed -r 's/([^.]*\.[^.]*)\./\1 /' file 
    
  2. Перл

    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 
    

Связанный контент