Список аргументов Awk слишком длинный, но только если я увеличу данные в переменной - PullRequest
0 голосов
/ 01 мая 2020

Я написал рабочий сценарий bash, который зацикливает некоторые файлы на чтение их простого текста, изменяет его на sed и заменяет строку в файле шаблона измененным текстом.
Я добился этого, избавившись sed для заменяемой части (мне было довольно сложно использовать ее для многострочной подстановки в моем конкретном случае c).
awk работала нормально до сих пор, когда я пытаюсь увеличить количество абзацев в файл (от 200 до 225). Я получаю сообщение об ошибке script.sh: line 11: /usr/bin/awk: Argument list too long, и файл шаблона теперь прерывается намного раньше (открытие, 14 абзацев, закрытие), чем когда он работал (открытие, 200 абзацев, закрытие).

Почему это происходит? Как я могу решить эту проблему, возможно сохраняя awk?
Почему awk печатает только 14 абзацев вместо 200, которые он мог печатать раньше?
Почему set -e не останавливает сценарий после этого? появляется ошибка?

Этот скрипт работает до тех пор, пока файл не станет слишком большим:

#!/bin/bash
set -e

cp template.bkp template.txt

for file in text/* ; do
    modifiedText=$(sed '...' $file | fold -w 50 -s)
    modifiedText+="

#REPLACESTRING"
    awk -v modifiedText="$modifiedText" '{gsub("#REPLACESTRING", modifiedText, $0); print}' template.txt > template-tmp.txt && mv template-tmp.txt template.txt
done
awk '{gsub("#REPLACESTRING", "", $0); print}' template.txt > template-tmp.txt && mv template-tmp.txt template.txt

[...]

Файл шаблона выглядит следующим образом:

Opening

#REPLACESTRING

Closing

1 Ответ

2 голосов
/ 01 мая 2020

После быстрого прочтения похоже, что вы добавляете несколько файлов и добавляете верхний и нижний колонтитулы. Если это так, лучше отменить операции

tempfile=$(mktemp)
sed '...' text/* | fold -w 50 -s >> "$tempfile"    
sed -e '/#REPLACEMENT/ {' -e "r $tempfile" -e 'd' -e '}' template > output
rm "$tempfile"

sed, которые могут работать с несколькими файлами, без необходимости проходить через l oop. Также используйте bash как оркестровку операций, сохраняйте текст в файлах и выполняйте обработку текста с помощью таких инструментов, как awk и sed, что вы сделали частично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...