Как заменить значение в каждом поле до определенного символа в каждой записи? - PullRequest
0 голосов
/ 29 декабря 2018

Каждая запись идет с именами столбцов.Это труба с разделителями.Я должен заменить их в каждой записи, как показано ниже: Входные данные:

COMPILES=1|PROPS=inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|SCPU=30828

Выходные данные:

1|inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|30828

Я пытался с помощью команды sed 's/[^|]*=//g' заменить все последовательности|после символов = ничего, кроме 2-го столбца, печатается только последнее значение.Есть ли способ заменить только 1-й экземпляр в каждом поле?

1|en-US|30828

Ответы [ 4 ]

0 голосов
/ 30 декабря 2018

Использование Perl

$ cat mullapudi.log
COMPILES=1|PROPS=inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|SCPU=30828

$ perl -F"\|" -ane ' s/^.+?=//g for @F; print join("|",@F) ' mullapudi.log
1|inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|30828
0 голосов
/ 29 декабря 2018

Использование sed:

$ sed 's/\(^\||\)[^=]\+=/\1/g' file
1|inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|30828

Объяснено:

  • s/ заменить
  • \(^\||\)[^=]\+= начало (^) или (\|) разделитель (|) и все не = s и =
  • /\1/g с началом или разделитель (\1) глобально (g)

т.замените ^THIS= на ^ и |THIS= на |.

0 голосов
/ 29 декабря 2018

еще awk

$ awk 'BEGIN{FS=OFS="|"} {for(i=1;i<=NF;i++) sub(/[^=]+=/,"",$i)}1' file

результаты с

1|inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US|30828
0 голосов
/ 29 декабря 2018

Попробуйте с этим:

awk -v RS='|' -v ORS='|' '{sub("[^.]*=","")}1' input | sed "s|\|$||g" 
  • RS, разделитель записей, обычно это перевод строки, в этом случае он меняется на |, поэтому запись будет COMPILES=1 или PROPS=inet.timeoutDownload=5000;inet.timeoutIO=5000;inet.timeoutOpen=5000;inet.urlBase=vxml3-elr:7000/CVP/;swirec_language=en-US
  • ORS, разделитель выходных записей, также переводится на новую строку, изменяется на |, поэтому при печати выходные данные будут разделены на |
  • sub("[^.]*=",""), это aленивое регулярное выражение для замены первого значения перед =, подробнее об этом в https://unix.stackexchange.com/questions/49601/how-to-reduce-the-greediness-of-a-regular-expression-in-awk
  • sed "s|\|$||g" для удаления последнего |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...