
как удалить второй символ "." из строки
У меня есть это (но это удаляет первую "." из вывода)
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
Вот несколько способов удалить секунду .
из строки файла (они повлияют на все строки файла):
sed
. Тыуже естьчто, вероятно, является лучшим способом, но вот еще один:sed 's/\([^.]*\.[^.]*\)\./\1 /' file
Это будет искать самый длинный отрезок не-
.
([^.]*
), затем a.
(\.
), затем следующий отрезок не-.
и, наконец, a.
(\.
). Скобки фиксируют шаблоны, поэтому мы можем ссылаться на него как\1
. Таким образом, команда выше просто удалит второй.
и заменит его пробелом.Если у вас GNU
sed
(по умолчанию в Linux), вы можете упростить это до:sed -r 's/([^.]*\.[^.]*)\./\1 /' file
Перл
perl -pe 's/([^.]*\.[^.]*)\./\1 /' file
или
perl -F'\.' -ane 'print "$F[0].$F[1] ", join ".", @F[2..$#F]' file
awk
(Я уверен, что есть способ получше)awk -F. '{printf "%s.%s ",$1,$2; for(i=3;i<NF;i++){printf "%s.",$(i); }print $NF}' file