заменить блок текста содержимым файла

У вас не может быть языкового стандарта, использующего UTF-16 в системе POSIX, поскольку он несовместим с языковым стандартом C.

С помощью GNU awk вы можете:

LC_ALL=C awk -v RS='\n\0' -v ORS='\n\0' -F '[|]\0' '{print $1}'

То есть обрабатывать ввод как поток байтов, но устанавливать разделители записей и полей как их двухбайтовые кодировки UTF-16LE. .

Это не сработало бы, если бы входные данные содержали такие вещи, как:

<U+0AFF><U+FF00>

Что будет закодировано как FF0A00FF (то есть содержит разделитель записей \ n \ 0 ).

Преобразование в UTF-8 кажется единственным надежным вариантом. Однако вам не нужно использовать временный файл (здесь предполагается, что карта символов локали UTF-8)

< file.in iconv -f UTF-16LE |
  awk -F'|' '{print $1}' |
  iconv -t UTF-16LE > file.out

Поскольку никакой другой символ, кроме | в UTF-8, не может содержать байт для | (0x7c) (то же самое для новой строки или любого символа в переносимом наборе символов), вы также можете оптимизировать, используя локаль C для awk или даже используя cut :

< file.in iconv -f UTF-16LE -t UTF-8 |
  LC_ALL=C cut -d '|' -f1 |
  iconv -f UTF-8 -t UTF-16LE > file.out
1
20.03.2019, 14:22
2 ответа

С ed(1):

echo -e '/\$Elements\$/+1,/\$EndElements\$/-1d\n.-1r f2\nw' | ed -s f1

Подробно:

  • /\$Elements\$/+1,/\$EndElements\$ /-1соответствует строкам между $Elements$и $EndElements$
  • dудаляет указанные строки
  • . .-1теперь является строкой выше $EndElements$
  • r f2читает файл f2
  • wзаписывает результаты.
2
27.01.2020, 23:19
sed -e "
   /$lead/,/$tail/!b
   //!d
   /$lead/r f2
" f1

Результаты

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

Работа

  1. Сначала мы выбираем правильный диапазон с помощью ,оператора запятой.
  2. Все строки, которые не попадают в этот диапазон, печатаются как есть с помощью команды b, которая передает управление в конец кода sed для этой строки (s ).
  3. Тело диапазона удалено, //!dтак как мы намерены заменить тело диапазона пользовательским файлом f2.
  4. Выводная линия при обнаружении считывает содержимое пользовательского файла f2 в очередь печати (, которая, заметьте, не совпадает с пространством шаблонов.)
  5. Когда элемент управления достигает конца кода sed, содержимое пространства шаблонов, удерживающее выводную строку как опорожняемую, выводится на стандартный вывод, а ПОСЛЕ этого события содержимое очереди выгружается на стандартный вывод.
2
27.01.2020, 23:19

Теги

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