Дублируйте строку внутри файла и перезапишите другую, используя sed - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь пакетно отредактировать многострочный файл M3U с помощью sed с содержимым, подобным следующему:

#EXTINF:-1 tvg-id="NBC.us" tvg-name="NBC US" tvg-logo="http://example.com/NBC.us.png" tvg-chno="12" group-title="United States",NBC

Я хотел бы найти / заменить, чтобы в итоге получилось что-то вроде следующего:

#EXTINF:-1 tvg-id="NBC.us" tvg-name="NBC" tvg-logo="http://example.com/NBC.us.png" channelid="12" group-title="United States",NBC

Другими словами, мне нужно найти / заменить tvg-chno на channelid И скопировать строку из (не включая) последнего , в конец строки и использовать еепереписать содержимое tvg-name.У меня есть команда sed, работающая с первым битом, и битая команда не совсем работает, как предназначено для второй, следующим образом:

sed -i 's/tvg-chno/channel-id/g' test.m3u    
sed -i 's/\(.*tvg-name="\)\(.*"\)\(.*",\)\(.*\)/\1\4\3\4/g' test.m3u

Вторая команда sed выдает:

#EXTINF:-1 tvg-id="NBC.us" tvg-name="NBCUnited States",NBC

Iнадеялся, что сможет выполнить все преобразования в одну строку, если это возможно.

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

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

sed -r 's/(tvg-name=")[^"]*(".*)tvg-chno(.*,([^,]*))$/\1\4\2channelid\3/' file

Совпадение с образцом в строках и использование обратных ссылок для достижения требуемого результата.

NB это предполагает, что tvg-chnoвсегда будет следовать tvg-name, в противном случае потребуется две замены.

0 голосов
/ 29 мая 2018

Чтобы не перехватывать слишком много старого значения, вторая команда должна быть:

's/\(tvg-name="\)\([^"]*\)\(".*",\)\(.*\)/\1\4\3\4/'

Чтобы объединить две команды в одну, просто объедините их точкой с запятой:

sed -i 's/.../.../g;s/.../.../' test.m3u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...