Я работаю с .csv
выводом этого запроса данных SE, который выглядит следующим образом (только с 5022 записями):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(И у него есть ^M
окончания строки между [число] и "" заголовок ""). Мне нужно, чтобы это выглядело так:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Я исправил это в определенном текстовом редакторе, который довольно легко останется безымянным, но я хотел создать скрипт, чтобы мне не приходилось делать его снова каждый раз при обновлении запроса, чтобы другие могли его использовать. Я использовал sed
...
Эта серия команд работает отлично (хотя вполне может быть неэффективной; это всего лишь метод проб и ошибок):
# Print the ^M and remove them, write to a new file:
cat -v QueryR* | sed 's/\^M//' > QueryNew
# remove all the other junk:
sed -i 's/{//' QueryNew
sed -i 's/}//' QueryNew
sed -i 's/""//g' QueryNew
sed -i 's/^"//' QueryNew
sed -i '/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}' QueryNew
sed -i 's/^\s\+//' QueryNew
sed -i '/^\s*$/d' QueryNew
sed -i 's/^id:\ //' QueryNew
sed -i 's/,\ /,/' QueryNew
sed -i 's/\\//g' QueryNew
Так почему бы и нет? Только ^M
и {}
удаляются, а все остальное еще есть.
#!/bin/bash
cat -v QueryR* | sed 's/\^M//' > QueryNew
sed -i '{
s/{//
s/}//
s/""//g
s/^"//
/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}
s/^\s\+//
/^\s*$/d
s/^id:\ //
s/,\ /,/
s/\\//g
}' QueryNew
Я уверен, что моя ошибка действительно очевидна ...
источник
\r
.jq
разбит на первую строку, где поле заголовка имеет двоеточие (первая строка). Я до сих пор не знаю , почемуsed
меня ненавидит, но я убил некоторых из цитат и\r
в этой линии ,/,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}
и , наконец , она работает , как это . Большое спасибо ^ _ ^sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -
как по волшебству)Я исправил это благодаря Steeldriver и дальнейшим изменениям. Не определено, но работает.
перевод:
s/"{//
Удалить"{
s/}"//
Удалить}"
s/^"//
Удалить"
из начала/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}
совпадения строк,\r
в одной строке и[whatever]title[whatever]:
в следующей строке заменить все это на,
s/""//g
Удалить все оставшиеся двойные двойные кавычкиs/^\s\+//
Удалить пробелы в начале строк/^\s*$/d
Удалить пустые строкиs/^id:\ //
Удалитьid:
и пробел после негоs/\\//g
Удалить обратные слэши (экранирующие символы для "добавлено в некоторые поля заголовка)tee "$1"
укажите выходной файл при запуске скрипта, например./queryclean newquery.csv
источник
Пока вопрос задается
sed
, можно обойти проблемы sed с Python:Этот код совместим как с python2, так и с python3, поэтому любой из них будет работать
Образец прогона:
источник
Еще три подхода:
AWK
Perl
GNU grep с регулярными выражениями, совместимыми с Perl, и простым Perl:
источник
Это не совсем ответ на ваш вопрос или решение вашей проблемы, но чтобы избавиться от нежелательных символов, вы можете использовать tr :
и вы получите:
источник
tr
:)Это еще один скрипт, написанный на Ruby. Он сохранит запятые в заголовке, которые можно легко импортировать в любую программу электронных таблиц, не разбивая столбцы.
После запуска программы полученный вывод будет выглядеть так:
источник
:
внутри них?