Unix-файл с символами новой строки в кавычках

Обратите внимание на подробности того, как кросс-компиляция драйверов MadWifi для других архитектур.Например, в вашем случае вы пытаетесь скомпилировать для ARM4, хотя, возможно, не намеренно.

выдержка

Кросс-компиляция

Система сборки предназначена для поддержки кросс-компиляции без любые модификации файлов распространения. Достаточно указать какие-либо параметры в командной строке make.

В большинстве случаев необходимо определить только KERNELPATH и CROSS_COMPILE. CROSS_COMPILE - это префикс для инструментов кросс-компиляции. Например, если кросс-компилятор называется arm-linux-gcc, установите для CROSS_COMPILE значение "arm-linux -":

  $ make KERNELPATH = / usr / src / linux-arm CROSS_COMPILE = arm-linux - 
 

Система сборки определяет ARCH и TARGET на основе файла .config в дереве сборки Linux. В некоторых необычных системах может потребоваться указать TARGET в командной строке . Если ARCH определяется неправильно, сообщите об этом.

2
08.04.2019, 19:56
4 ответа

Вы можете попробовать с помощью sed:

sed '
  :A
  2,$ {
    /[^"]\"$/! {
      N
      bA
    }
    s/\n//g
  }
' infile

Захват в каждой строке от 2 до конца, если последний символ "
Если нет, получите новую строку и перезапустите цикл.
В конце цикла удалите все "\n".

1
27.01.2020, 22:02

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

Команда -строка:

$ sed -Ee '
   1b
   /^("[^"]*"[^"]*)*$/!{
      N;s/\n/ /;s/^/\n/;D
   }
' input.csv

Результаты:

ID,Name,Text
"1","abc","Line 1"
"2","def","Line2 ""line2"",line2"
"3","ghi","line3"

Пояснение:

  • -Eвключает расширенный режим регулярных выражений.
  • 1bвыведет заголовок на стандартный вывод как есть.
  • /^("[^"]*"[^"]*)*$/будет соответствовать строке, полностью сбалансированной по отношению к двойным кавычкам.
  • Следовательно, когда мы отрицаем это, мы получаем наши несбалансированные строки, IOW, нам нужно искать их закрывающие двойные кавычки в следующей строке (s ).
  • Мы читаем в следующей строке и добавляем к пространству шаблона, N, и удаляем новую строку.
  • Мы повторяем этот процесс до тех пор, пока пространство шаблонов не будет сбалансировано.

С помощьюPOSIXsedвам нужно будет несколько изменить приведенное выше:

$ sed -e '
   1b
   /^\("[^"]*"[^"]*\)*$/b
   N;s/\n/ /;H;s/.*//;x;D
' input.csv
0
27.01.2020, 22:02

С вашим файлом проблем нет. Он имеет встроенные символы новой строки и двойные кавычки. Парсер CSV сможет правильно с этим справиться. Экранирование двойных кавычек с помощью"(при двойном заключении в кавычки поля )— правильный способ избежать встроенных двойных кавычек в файле CSV.

Чтобы заменить встроенные символы новой строки в файле CSV на символ @, вы можете сделать это:

$ csvformat -M '@' file.csv | tr '\n@' '@\n'
1,abc,Line 1
2,def,"Line2@""line2"",line2"
3,ghi,line3

Здесь используется csvformatиз набора инструментов csvkit . Это правильный парсер CSV, способный переформатировать файлы CSV.

Приведенный выше конвейер команд сначала заменяет все символы новой строки, в которые не встроены с символом @. Затем я использую trдля замены оставшихся символов новой строки и символов @друг с другом, в результате чего получается CSV-файл, в котором встроенные символы новой строки @.

Это связано с тем, что исходные данные в файле не содержат символов @.

Если затем вы хотите использовать пробелы вместо маркера того места, где изначально были новые строки, используйте tr '\n@' ' \n'вместо tr, показанного выше:

$ csvformat -M '@' file.csv | tr '\n@' ' \n'
1,abc,Line 1
2,def,"Line2 ""line2"",line2"
3,ghi,line3

Обратите внимание, что это чрезвычайно затруднит повторную -вставку исходных символов новой строки, если в данных (есть другие пробелы, как в третьем поле первой строки ). ].

Если вы предпочитаете, чтобы csvformatне удалял все ненужные двойные кавычки, используйте его с-U 1:

$ csvformat -U 1 -M '@' file.csv | tr '\n@' ' \n'
"1","abc","Line 1"
"2","def","Line2 ""line2"",line2"
"3","ghi","line3"
6
27.01.2020, 22:02

Использование Raku (, ранее известного как Perl _6)

raku -MText::CSV -e 'my $csv=Text::CSV.new; .perl.put for $csv.getline_all(open($*ARGFILES, :r, :!chomp));' 

Пример ввода:

ID, Name, text
"1","abc","Line 1"
"2","def","Line2
""line2"",line2"
"3","ghi","line3"

Пример вывода:

$["ID", "Name", "text"]
$["1", "abc", "Line 1"]
$["2", "def", "Line2\n\"line2\",line2"]
$["3", "ghi", "line3"]

Вы можете обрабатывать кавычки и встроенные символы новой строки, используя язык программирования Raku и специальный модуль (, например.Text::CSV). Для визуализации символа \nя добавил вызов.perl(FYI, .rakuтакже работает ). Добавьте сопоставление в поля, чтобы изменить встроенные символы новой строки на символы подчеркивания (дополнительный код, ниже):

raku -MText::CSV -e 'my $csv=Text::CSV.new; .put for $csv.getline_all(open($*ARGFILES, :r, :!chomp)).map(*.subst("\n","_", :g));' 

Обновлен выход (1):

ID Name text
1 abc Line 1
2 def Line2_"line2",line2
3 ghi line3

Из первоначальной публикации OP действительно неясно, нужны ли «двойные» двойные -кавычки (или нет ). Простое добавление вызова .perlк коду выше дает экранированные двойные кавычки -(ниже ), что может быть более желательным:

Обновлен выход (2):

"ID Name text"
"1 abc Line 1"
"2 def Line2_\"line2\",line2"
"3 ghi line3"

https://modules.raku.org/dist/Text::CSV:cpan:HMBRAND
https://github.com/Tux/CSV
https://raku.org

0
23.09.2021, 19:37

Теги

Похожие вопросы