Как изменить новую строку, не начинающуюся символом («), на другую строку

#regex #string #sed

#регулярное выражение #строка #sed

Вопрос:

Мне нужно изменить новую строку, не начинающуюся с " (кавычки), на другое печатное слово, например n , или <br> .

Я пробовал это, но это не работает:

 cat file.csv | sed 's/^[^"]/<br>/g'
 

Пример входного файла:

 cat file.csv

"a","bcde","fgh
ijk
   mnopq
asd"
 

Вывод, который мне нужен:

 cat file.csv

"a","bcde","fgh<br>ijk<br>   mnopq<br>asd"
 

Ответ №1:

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

 "abc","def
"
 

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

 sed -E '/^("[^"]*"[^"]*)*"[^"]*$/{:a;N;/^("[^"]*"[^"]*)*$/{s/n/<br>/g;bb};ba;};:b;' file
 

-E переключает синтаксис регулярных выражений на ERE (расширенное регулярное выражение)
-i изменяет содержимое файла на месте (когда вы уверены, добавьте этот переключатель)

детали команды:

 /^("[^"]*"[^"]*)*"[^"]*$/ # check if the line has an odd number of quotes
{ # when the match succeeds:
    :a; # define a label "a"
    N;  # append the next line to the pattern space
    /^("[^"]*"[^"]*)*$/ # check if the pattern space contains an even number of quotes
    { # in this case:
       s/n/<br>/g; # proceed to the replacement
       bb; # go to label "b"
    };
    ba; # go to label "a"
};
:b; # define the label "b"
 

Ответ №2:

Вы можете использовать условное ветвление в sed :

 sed -i -E ':a;N;s~n([^"])~<br>1~;ba' file.csv

# check results    
cat file.csv

"a","bcde","fgh<br>ijk<br>   mnopq<br>asd"
 

Подробнее об этом

Комментарии:

1. Спасибо. но у меня есть особая строка только с кавычкой

2. abcd » «a»,»a» что я делаю, чтобы увеличить эту цитату в строке 2 до конца строки 1?

3. Не размещайте какие-либо данные в кавычках, иначе они потеряют форматирование. Лучше покажите новый ввод, о котором идет речь, чтобы я мог лучше его понять.

4. @JackMagor: вы можете использовать: sed -E ':a;N;s~n([^"])~<br>1~;ba; :a;N;s/n"n/"n/g;ba' file.csv