Заменить текст в строках в файл с шагом

Con respecto a la "piratería de software", no estoy seguro de que sea necesaria en absoluto, porque la información del kernel sobre la opción "consola" incluye lp0 como una posibilidad. Entonces podría habilitar EPP/ECP en el puerto, habilitar una consola en Ubuntu, para que maneje este puerto paralelo DB25.

Acepto que el cable Cisco es un DB25 serial y no funcionará para el uso de un puerto paralelo.

Pero, sobre "hackeo de hardware"

Caso 1 )Para tener un conector USB en el otro extremo. Supongo que cualquier convertidor de puerto paralelo -a USB que se venda para conectar una impresora a un puerto USB podría funcionar como un cable de consola, y solo proporcionaremos un adaptador de cableado macho -a -macho adecuado de 25 pines. Un adaptador ya hecho -sería un cable LapLink.https://en.wikipedia.org/wiki/LapLink_cable#Wiring

Caso 2 )Para tener un conector serial )DB9 (en el otro extremo, necesitará un host USB que haga la traducción a un segundo cable serial USB -a -, pero solo una Raspberry Pi podría ser una solución económica para realizar la comunicación de paso desde el cable USB paralelo -a -al USB -a -.

solo para decir que es factible.

0
07.04.2019, 20:34
3 ответа

Я думаю, что этот awkскрипт должен работать. Он делает все из скрипта, так как это самая простая настройка. Но см. далее альтернативу, которая позволяет обрабатывать ваш nextcounter как переменную оболочки:

BEGIN
    { getline counter < "nextcounter"; }
/TRANSID000/
    {
      replacement_string = sprintf("TRAN%05d", counter++);
      gsub("TRANSID000", replacement_string);
      print;
    }
END
    { printf("%d\n", counter) > "nextcounter"; }

Вы можете вызвать его с помощью одного -вкладыша, подобного этому:

cat data | awk -- 'BEGIN { getline counter < "nextcounter"; } /TRANSID000/{ replacement_string = sprintf("TRAN%05d", counter++); gsub("TRANSID000", replacement_string); print; } END { printf("%d\n", counter) > "nextcounter"; }'

Обратите внимание:

  • В своем OP вы сначала говорите, что вам нужна строка, подобная TRAN000066, т.е. имеющая всего 6 цифр,но тогда ваш образец вывода имеет строку типа TRAN00066, т.е. с 5 цифрами. Я следовал вашему образцу вывода, но если вместо этого вам нужна точность 6 -цифр, просто измените строку TRAN%05dнаTRAN%06d
  • Согласно вашему описанию, номер, взятый из файла nextcounter, был первым номером для замены. Если вместо этого вы хотите сначала увеличить число, просто замените часть counter++на++counter
  • Я рассматривал nextcounterкак файл, содержащий только одну строку, содержащую только числовое целое число. Если это не совсем так, вам нужно изменить скрипт BEGINи ENDраздел
  • .

Если вы предпочитаете , а не , чтобы сценарий awk обновлял ваш nextcounterфайл напрямую и вместо этого обрабатывал такое значение nextcounter как переменную оболочки, вам потребуется немного более сложная настройка, включающая использование временного файла. для хранения обновленного счетчика. Что-то вроде этого:

tempfile=$(mktemp) ; cat data | awk -v counter="${nextcounter:-0}" -v tempfile="${tempfile}" -- '/TRANSID000/{ replacement_string = sprintf("TRAN%05d", ++counter); gsub("TRANSID000", replacement_string) ; print; } END { printf("%d\n", counter) > tempfile; }' && read nextcounter < "${tempfile}" ; rm "${tempfile}"

Разобрано для объяснения:

tempfile=$(mktemp) \ # create temporary file
cat data | pipe data to awk...
    awk -v counter="${nextcounter:-0}" -v tempfile="${tempfile}" -- \ # provide initial counter and tempfile to awk
    '/TRANSID000/ \
        { replacement_string = sprintf("TRAN%05d", ++counter); \
          gsub("TRANSID000", replacement_string) ; \
          print; \
        } \
     END \
        { printf("%d\n", counter) > tempfile; }' \ # write updated counter to temporary file
    && read nextcounter < "${tempfile}" \ # read updated counter into ${nextcounter} shell variable
rm "${tempfile}"

Это ожидает начальный счетчик в ${nextcounter}и обновляет ту же самую переменную в конце.

ЕСЛИ создание временных файлов невозможно, вы можете попробовать использовать файловые дескрипторы -поверх безымянных каналов, но для этого требуется Bash v3+ и система, позволяющая открывать каналы в режиме чтения/записи. Linux это позволяет, MacOS — нет, не знаю о других Unix -es.

Было бы похоже:

exec 9<> <(:) ; cat data | awk -v counter="${nextcounter:-0}" -- '/TRANSID000/{ replacement_string = sprintf("TRAN%05d", ++counter); gsub("TRANSID000", replacement_string); print; } END { printf("%d\n", counter) > "/dev/fd/9"; }' && read nextcounter <&9 ; exec 9<&-

В разобранном виде:

exec 9<> <(:) # open fd 9 onto unnamed pipe R/W
cat data | \
    awk -v counter="${nextcounter:-0}" -- \
    '/TRANSID000/ \
         { replacement_string = sprintf("TRAN%05d", ++counter); \
           gsub("TRANSID000", replacement_string); \
           print; } \
      END \
         { printf("%d\n", counter) > "/dev/fd/9"; }' \ # write updated counter to fd 9
    && read nextcounter <&9 # read updated counter from fd 9 into ${nextcounter} shell variable
exec 9<&- # close fd 9
1
28.01.2020, 02:30

если ваш файл находится в «файле», в оболочке типа bash

inp=66;i=$inp; while read -r ln;do;echo $ln sed -E "s/TRANSID000/TRAN0000$i/i";let i++;done<file
0
28.01.2020, 02:30

Сperl:

perl -spe 's/TRANSID000\K/$n++/e' -- -n=66 < your-file

Или, если вам нужно, чтобы число было дополнено нулями до длины 5 (00001, 00010, 00100...):

perl -spe 's/TRANSID\K000/sprintf "%05d", $n++/e' -- -n=66 < your-file
1
28.01.2020, 02:30

Теги

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