Соответствие разрывов строк внутри кавычек - PullRequest
0 голосов
/ 27 августа 2018

Мне нужно удалить каждый разрыв строки внутри кавычек (заменить \ n пробелом) таким образом:

 <tag>
     abc: "TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"
     abcd: "TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"

     abcde: "TEXTTEXTTEXTTEXT
     TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT
     TEXT"

     abcdef:TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"
   </tag>

Становится так:

<tag>
     abc: "TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"
     abcd: "TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"

     abcde: "TEXTTEXTTEXTTEXT TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT TEXT"

     abcdef:TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"
   </tag>

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

Я могу заменить все разрывы строк в файле:

% s / \ n / /

И я могу заменить все кавычки и их содержимое в файле:

% s /".*"/ /

Но я не могу сопоставить \ n внутри кавычек.

% s / ". * \ N" / /

Как мне это сделать? Спасибо !!

Ответы [ 4 ]

0 голосов
/ 07 сентября 2018
:%s/\v(\u)\n\s+(\u)/\1\2

\v .............. very magic (avoid a lot of backslashes)
\u .............. uppercase
\n .............. new line
\s+ ............. one space or more
( .............. start of regex group
) .............. end of regex group 

Мы ищем заглавные буквы, за которыми следует новая строка, за которой следует любое количество пробелов и, наконец, снова за заглавными буквами. Мы ставим вместе только группу 1 и 2.

0 голосов
/ 28 августа 2018

Если под словом «группа» вы подразумеваете «удалить», это может работать для вас:

:%g/field/norm f"d/"/e^Mdd

, где ^M равно Ctrl-V Введите

"Найти каждую строку с текстом" field ", затем в этой строке найти кавычку, удалить до следующей кавычки, а затем удалить всю строку."

0 голосов
/ 28 августа 2018

Это sed может работать для вас с циклом:

sed -E -e ':a' -e $'/^[^"]*"[^"]+$/{N;s/[[:blank:]]*\\n[[:blank:]]*/ /;}' -e 'ta' file

 <tag>
     abc: "TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"
     abcd: "TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"

     abcde: "TEXTTEXTTEXTTEXT TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT TEXT"

     abcdef:TEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXTTEXT"
</tag>
0 голосов
/ 27 августа 2018

:g и семейство работают построчно, что затрудняет обработку многострочных команд. Вы можете использовать обычный :s:

:%s/.*field\s*[^4]: "\_[^"]*"\n

Это работает, учитывая, что внутри ваших кавычек не было экранированных кавычек.

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