заменить все запятые, кроме последней, между двумя знаками равенства - PullRequest
0 голосов
/ 25 октября 2018

У меня есть требование, что у меня есть файл, и для каждой строки мне нужно заменить все запятые except the last one between two equal sign.Может ли кто-нибудь помочь в этом.

(предпочитать команду sed и отсутствие условия цикла)

Данные файла - >>

STREET:1:1=Zwaneweg 23, Box 0001, PIN002,TOWN.COUNTRY:1:1=BE/Schilde

Должно быть - >>

STREET:1:1=Zwaneweg 23? Box 0001? PIN002,TOWN.COUNTRY:1:1=BE/Schilde

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

С помощью sed вы можете запоминать совпадения и восстанавливать их.
Если вы хотите заменить только последнюю последнюю запятую, вы можете использовать

sed -r 's/(=.*),(.*,.*=)/\1?\2/' inputfile

Подстановочный знак является жадным, если у вас есть8 запятых между знаками равенства, седьмое будет заменено.
Вы можете сказать sed повторять его инструкцию, пока он не найдет совпадение с меткой.Ярлык: a вставляется перед заменой, и для «возврата» указывается ta.Команда становится

sed -r ':a;s/(=.*),(.*,.*=)/\1?\2/;ta' inputfile

Если у вас более двух знаков равенства, вы должны знать, где искать.Эта команда заменит первый муравей последним знаком равенства:

echo '1,a=2,b,b,b,=3,c=Only, this part, should have, the commas, except this one, replaced=5,e,e'|
   sed -r ':a;s/(=.*),(.*,.*=)/\1?\2/;ta'
1,a=2?b?b?b?=3?c=Only? this part? should have? the commas? except this one, replaced=5,e,e

Если вы хотите, чтобы замены выполнялись только между двумя последними знаками равенства, вам необходимо заменить подстановочный знак . на все, кроме знака равенства[^=], что еще сложнее будет прочитать команду

echo '1,a=2,b,b,b,=3,c=Only, this part, should have, the commas, except this one, replaced=5,e,e'|
   sed -r ':a;s/(=[^=]*),([^=]*,[^=]*=)([^=]*)$/\1?\2\3/;ta'
1,a=2,b,b,b,=3,c=Only? this part? should have? the commas? except this one, replaced=5,e,e
0 голосов
/ 25 октября 2018

Попробуйте что-то вроде этого:

mayankp@mayank:~/Documents$ cat tt.txt
STREET:1:1=Zwaneweg 23, Box 0001, PIN002,TOWN.COUNTRY:1:1=BE/Schilde

mayankp@mayank:~/Documents$ cat tt.txt| grep -o -P '(?<==).*(?==)'| rev |sed 's/,/?/2g' |rev > out.txt
mayankp@mayank:~/Documents/$ cat out.txt
Zwaneweg 23? Box 0001? PIN002,TOWN.COUNTRY:1:1

Теперь объедините out.txt с tt.txt, чтобы сохранить пропущенные данные.

mayankp@mayank:~/Documents/$ perl -0777 -i -pe "s/(=).*(=)/\$1`cat out.txt`\$2/s" tt.txt
mayankp@mayank:~/Documents$ cat t3.txt 
STREET:1:1=Zwaneweg 23? Box 0001? PIN002,TOWN.COUNTRY:1:1=BE/Schilde
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...