Я хочу заменить некоторые строки в файле командой sed linux.Вот чего я хочу достичь:
cn.x1.x2 y -> cn_x1.x2 y cn.x1.x2.x3 y -> cn_x1_x2.x3 y cn.x1.x2.x3.x4 y -> cn_x1_x2_x3.x4 y
Я хочу найти любое слово, начинающееся с 'cn', и заменить точки подчеркиванием до второго последнего слова.Как я могу добиться этого с помощью регулярного выражения?
Заранее спасибо
Это может работать для вас (GNU sed):
sed -E ':a;s/\.([^.]*\.)/_\1/;ta' file
Заменить первый из двух периодов подчеркиванием и повторять до тех пор, пока совпадение не завершится.
Вы можете сделать это в два шага с помощью sed:
sed
echo 'cn.x1.x2.x3.x4 y' | sed -r 's|\.|_|g; s|\_([^_]*)$|.\1|'
Первый шаг заменяет все точки подчеркиванием s|\.|_|g;
s|\.|_|g;
Второй шаг заменяет все, кроме последнегоподчеркнуть с точкой.s|\_([^_]*)$|.\1|
s|\_([^_]*)$|.\1|
если ваши данные в файле 'd', от gnu sed:
sed -E 'h; s/(cn\S+)\.\S+\s\S+$/\1/;s/\./_/g;G;s/(.*)\ncn\S+(\.\S+\s\S+)$/\1\2/' d
от perl:
perl -pe 's/(?!.[^.]+\s\S+$)\./_/xg' d
Perl на помощь!
perl -pe 's/\./_/ while /cn.*\..*\./' < input > output
Другими словами, замените . на _, пока есть как минимум две точки.
.
_