Вам может понадобиться следующий sed
скрипт:
sed -n '$p;N;s/[[:blank:]]*\n[[:blank:]]*;/;/;P;D' csv_file
Разобрано для объяснения:
$p; # at last line of stream, just print it
N; # append the next line from input so that we always consider two lines at a time...
s/[[:blank:]]*\n[[:blank:]]*;/;/; # then replace `\n;` (and any leading and trailing blanks) with just `;`, and...
P; # print only the _first_ of the two lines present in memory and...
D # then delete it and read one new line if memory becomes empty
Обратите внимание, что первая команда, $p
, на самом деле выводит что-то, только если общее количество входных строк нечетное, потому что остальная часть скрипта гарантирует, что в памяти всегда есть две строки из входного потока
<<<
не «непрерывно отправляет строку». Он отправляет строку только один раз. Точнее, он создает временный файл, содержащий строку, и открывает его на стандартном вводе программы.
Похоже, что эта программа глючит и перематывает входной поток, когда он достигает конца.
Чтобы обойти эту ошибку, используйте конвейер для отправки входных данных вместо временного файла. Труба не может быть перемотана, так что это не вызовет эту конкретную ошибку.
echo G |./program.exe
Использование конвейера может вызвать другую ошибку. Некоторые программы действительно плохо работают, когда их ввод не поступает с терминала. Если конвейер не работает, следующим шагом будет использование expect для запуска программы с фактическим терминалом (без взаимодействия с пользователем :expect управляет взаимодействием ). Expect позволяет вам контролировать, что отправляется и принимается на терминале, а также когда это отправляется. Вот сценарий ожидания, который имитирует вводG
Enter сразу после запуска программы:
#!/usr/bin/expect -f
spawn./program.exe
send "G\r"