Замените строки с помощью команды sed на регулярное выражение - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу заменить некоторые строки в файле командой 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', и заменить точки подчеркиванием до второго последнего слова.Как я могу добиться этого с помощью регулярного выражения?

Заранее спасибо

Ответы [ 4 ]

1 голос
/ 18 апреля 2019

Это может работать для вас (GNU sed):

sed -E ':a;s/\.([^.]*\.)/_\1/;ta' file

Заменить первый из двух периодов подчеркиванием и повторять до тех пор, пока совпадение не завершится.

1 голос
/ 17 апреля 2019

Вы можете сделать это в два шага с помощью sed:

echo 'cn.x1.x2.x3.x4 y' | sed -r 's|\.|_|g; s|\_([^_]*)$|.\1|'

Первый шаг заменяет все точки подчеркиванием s|\.|_|g;

Второй шаг заменяет все, кроме последнегоподчеркнуть с точкой.s|\_([^_]*)$|.\1|

0 голосов
/ 17 апреля 2019

если ваши данные в файле '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
0 голосов
/ 17 апреля 2019

Perl на помощь!

perl -pe 's/\./_/ while /cn.*\..*\./' < input > output

Другими словами, замените . на _, пока есть как минимум две точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...