#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