Intereting Posts
Какова цель абстракций, сеанса, лидера сеанса и групп процессов? sed – найти и заменить текст, содержащий "/" Linux mint не запрашивает имя пользователя и пароль Каков наилучший инструмент для автоматизации 32-64-битных библиотек для Unix и Windows, создающих программное обеспечение на C ++, воспроизводимое пользователями и машинами? Преобразование физического раздела в LVM Цвет печатается справа при написании собственного скрипта в byobu Как передать аргумент с пробелами функции сценария оболочки? Распознавание дополнительных клавиш клавиатуры: Steelseries Apex Есть ли инструмент командной строки для обработки изображений? По умолчанию оболочка не выбрана с помощью useradd Могу ли я снова подключиться к отдельной сессии mosh? Переименуйте несколько каталогов с помощью команды переименования, имя включает в себя скобки Sudo – целевая пользовательская среда Выполнение нескольких функций bash в фоновом режиме и ожидание, пока они не вернутся linux: Отбросить грязные страницы для блочного устройства (при отключении usb)

Запишите переменную, содержащую большой текст, с \ n в файл с обычными интерпретаторами интерпретаторов. Как ты делаешь это?

Окружающая среда: оболочка linux или лучше, зольная оболочка в busybox (пример системы: Openwrt).

Учитывая строковую переменную с большим текстом "${a}" построенным таким образом:

 for index in $(seq 1 40000); do #it is 40000 for a reason, it helps if you want to reproduce the error on your system. a="${a}""\n""word ${index}" done 

и учитывая тот факт, что попытка использовать эту переменную в качестве аргумента для общей команды вызывает ошибку, например:

 echo "${a}" #fails awk -v VAR_A="${a}" '<program>' #fails 

(сбои должны быть: http://www.in-ulm.de/~mascheck/various/argmax/ )

Как вы пишете такую ​​переменную в текстовый файл, возможно, используя только простые команды, а не sed / awk / perl / другой мощный интерпретатор.

В идеале текстовый файл должен выглядеть так:

 word 1 word 2 word 3 ... 

и не нравится:

 word 1\nword 2\nword 3\n... 

Update1: Кто-то спрашивает: «Почему вы не можете изменить скрипт, производящий переменную $a ?». Потому что я не могу из-за, скажем, отсутствия авторизации (« скрипт работал до сегодняшнего дня, поэтому вы можете исправить только часть печати »). Таким образом, дается $a и его формат, я могу найти способ распечатать его в файле.

Обновление2: использование предложенных «здесь документов» разрешает большинство проблем, но все же у меня есть содержание, напечатанное в одной строке. Может быть, мой конфиг?

Вы можете сделать здесь документ и использовать cat :

 $ cat <<EOT >output $a EOT $ wc -l output 40000 

Я не знаю точно, насколько эффективна ваша зоба Busybox (она настраивается), но это должно работать где угодно, даже без встроенных функций. Он расширяет значение переменной в квази-файл, который затем присваивается cat , а не помещает значение в командную строку.


Поскольку у вас, кажется, есть буквальный "\n" в вашей строке, от которой вы хотите избавиться, вы также можете использовать замену строк во время подстановки параметров. Это можно настроить из ash Busybox, и в этом случае вам придется перейти к sed . Если у вас есть это расширение (не-POSIX), вы можете использовать ${var//\\\n/$NEWLINE} :

 $ busybox ash $ foo="x\ny\nz" $ echo "$foo" x\ny\nz $ NEWLINE=" " $ echo "${foo//\\\n/$NEWLINE}" x y z 

Это тот же синтаксис, что и Bash ; ${var/pattern/replacement} , где pattern является глобальным, если он начинается с / . Кажется, ваш ash имеет много настроек из этого, так что это может быть совсем не так. В этом случае вам, вероятно, придется пойти с sed , хотя, думаю, разумное использование IFS и read позволят вам обойти это и восстановить правильную строку.

 busybox seq -s' word ' 4000 | sed '/000/w /dev/fd/2' | wc -l 

ВЫВОД

 word 1000 word 2000 word 3000 word 4000 4000 

Вы должны просто использовать встроенную busybox и указать word в качестве разделителя. Затем вы можете >redirect его в файл, если хотите. В приведенном выше примере я разделился на sed чтобы вы могли получить представление о выходе без необходимости смотреть на 4000 строк, но все они были напечатаны. Если ваш busybox не поддерживает это, обновите .

Таким образом, в основном все, что вам нужно для всего этого:

 busybox seq -s' word ' $MAX_INCREMENT >$TO_FILE