sed: заменить перенос строки перед определенным шаблоном c на пробел - PullRequest
1 голос
/ 09 июля 2020

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

Пример:

<link rel="colorSchemeMapping
"
href="marinedrugs-790193-original.fld/colorschememapping.xml">

Должно быть:

<link rel="colorSchemeMapping" href="marinedrugs-790193-original.fld/colorschememapping.xml">

Мне известно о

':a;N;$!ba;s/\n/ /g'

, но я готов добавить двойные кавычки как обязательные перед разрывом строки.

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Поскольку вы все равно используете GNU sed:

$ sed -z 's/\n"\n/" /g' file
<link rel="colorSchemeMapping" href="marinedrugs-790193-original.fld/colorschememapping.xml">

Если вы обнаружите, что используете в sed конструкции, отличные от s, g и p (с -n), то вы используете неправильный инструмент и вместо этого следует использовать awk или подобное. Все остальные конструкции sed устарели 40+ лет назад go, когда была изобретена awk.

2 голосов
/ 09 июля 2020

Я предлагаю заменить newline+"+newline на " и пробел, а любые другие newline на пробел:

sed -i -E ':a;N;$!ba;s/\n(")\n|\n/\1 /g' file
sed -i ':a;N;$!ba;s/\n"\n/" /g; s/\n/ /g' file

или

sed -e ':a;N;$!ba' -e 's/\n"\n/" /g' -e 's/\n/ /g' file > newfile

LINE ЗАКЛЮЧЕНИЕ : Если ваши окончания - CRLF, вам необходимо заменить \n на \r\n в приведенных выше шаблонах.

Примечание -E включит синтаксис POSIX ERE (чтобы избежать использования слишком большого количества обратных косых черт) в выкройке). Регулярное выражение означает

  • \n(")\n - новую строку, затем " захватывается в Группу 1, а затем новую строку
  • | - или
  • \n - новая строка.

Замена - это значение Группы 1 (", если оно было найдено) и пробел.

См. онлайн sed демонстрацию :

s='<link rel="colorSchemeMapping
"
href="marinedrugs-790193-original.fld/colorschememapping.xml">'
sed -E ':a;N;$!ba;s/\n(")\n|\n/\1 /g' <<< "$s"
# => <link rel="colorSchemeMapping" href="marinedrugs-790193-original.fld/colorschememapping.xml"> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...