Как добавить абзац текста с номером в разные файлы, с увеличением номера в каждом файле

dialogno actualiza $OPAC en su lugar :tiene que extraer la información del usuario de los datos de $VALUES. Agregue este código antes deecho Entering next step...

{
read -r Name
read -r OPAC
read -r Intranet
read -r mysqlroot
read -r password
} <<<"$VALUES"

echo === debug info
echo "Name=>$Name<"
echo "OPAC=>$OPAC<"
echo "Intranet=>$Intranet<"
echo "mysqlroot=>$mysqlroot<"
echo "password=>$password<"
echo ===

Cuando esté satisfecho con él, comente los comandos de depuración echo.


Otra forma de abordar esto es usar el comando readarraypara capturar la salida del diálogo. Eso coloca los datos, no en una sola cadena, sino en una matriz indexada basada en 0 -, un valor por línea:

readarray -t data < <( dialog... 2>&1 1>&3 )
echo "debug: user data"
declare -p data
#...
sudo sed -i -e "5 a\Listen ${data[1]}" -e "5 a\Listen ${data[2]}" /etc/apache2/ports.conf
-4
28.02.2019, 16:48
3 ответа

Я думаю, что решение этой проблемы с помощью bash было бы кошмаром. Это, безусловно, выполнимо, особенно если вы открыты для использования awk, но тогда это тоже не совсем bash, так что вот немного python

from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument('--template', required=True, help="Template file")
parser.add_argument('--start', default=0, help="Number to begin counting from")
parser.add_argument('--stop', default=100, help="Number to end at")
parser.add_argument('--step', default=10, help="Number to increment by")
args = parser.parse_args()

for i in range(args.start, args.stop, args.step):
    with open('{}.txt'.format(i)) as pfile:
        pfile.write(args.template.format(count=i))

Вы можете запустить это, передав «--start» в качестве числа, с которого нужно начать, «--stop» в качестве числа, на котором следует остановиться, и «--step» в качестве числа, на которое следует увеличивать. Вы можете заменить свой абзац, заменив текст в переменной paragraphв верхней части скрипта или поместив текст в отдельный файл и передав имя файла, используя «шаблон --». Обязательно используйте {count}везде, где вам нужен номер в шаблоне.

0
28.01.2020, 05:20

Вот простой скрипт Python 3, который добавляет 10 к каждому числу.

#!/usr/bin/env python3

import fileinput
import re

rx = re.compile(r'(\d+)')
for line in fileinput.input():
    parts = rx.split(line.rstrip('\n'))
    if len(parts) > 1:
        for i in range(1, len(parts), 2):
            parts[i] = str(int(parts[i]) + 10)
        line = "".join(parts)
    print(line)

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

Чтобы вызвать это из сценария Bash, просто сохраните его в файле и chmod a+x filename.py. Итак, если вы сохранили его в ./splitnum.py, это команда для его запуска, как только вы убедитесь, что у него есть разрешение на выполнение.

Вот лайнер Perl one -:

perl -lne '@s = split(/(\d+)/); for($i=1;$i<=$#s;$i+=2) { $s[$i] += 10 }; print(join("", @s))'
1
28.01.2020, 05:20

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

i=100; for k in $(seq 100 10 1000); do sed "s/$i/$k/g" file > file.$k; done 

Предполагается исходный входной файл с именем fileсо следующим содержимым:

$ cat file 
aaaaaaaaaaaaaa100bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc100ddddddddddddddddd

И произведет file.100, file.110... file.1000.


Конечно, это займет несколько секунд, так как для каждого файла нужно запускать отдельную команду. Для более эффективного подхода вместо этого вы можете использовать команду Perl:

perl -ne 'for ($i=110;$i<=1000;$i+=10){s/(\d+)/$i/eg; open($fh,">","file.$i");  print $fh "$_" }' file
0
28.01.2020, 05:20

Теги

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