Повторение stdin при выполнении редактора (1) сценарий

/etc/resolv.conf часть конфигурации клиента DNS (который находится в его самой простой форме часть libc), который говорит это что серверы спросить при разрешении запроса DNS. Если можно жить без DNS, т.е. использовать IP-адреса для всего, которое включает жесткое кодирование они в /etc/hosts, Вам не будет нужен он. После того как необходимо будет разрешить имя хоста с помощью DNS, Вы испытываете необходимость в нем.

Для установки соединения, Вы должны:

  • поднимите устройство
  • присвойте IP устройству
  • настройте маршрутизацию - создают маршрут к шлюзу, добавляют, что значение по умолчанию направляет через шлюз.
6
30.12.2014, 00:10
3 ответа

Похоже, что вы хотите смоделировать сеанс интерактивного терминала, в котором пользователь вводит команду, ожидает ответа (или, учитывая, что цель ed , иногда ожидает ответа), затем вводит другую команду и т.д. Вы можете написать сценарий , ожидающий , но может быть достаточно просто отправить строку одновременно на терминал и в целевой процесс, с краткой паузой между каждой строкой.

    $ while IFS= read -r line
      do
        printf '%s\n' "$line" >/dev/tty
        printf '%s\n' "$line"
        sleep 0.5
      done < helloworld | ed
a
hello
world
.
,n
1   hello
2   world
,s,o,O,g
,n
1   hellO
2   wOrld
Q

Чтобы лучше отличить ввод от вывода, можно добавить цвет или другую подсветку в строку
echo «$ line» >/dev/tty или, в данном случае, включить символ подсказки в ed (команда P ), чтобы перед каждой командой ed отображался символ * .

-121--60460-

Поместите имя параметра перед @ , как показано ниже:

--data-binary file@myfile.bin

Из manpage :

name @ filename Это приведет к загрузке данных из данного файла (включая любые новые строки), URL-кодировать эти данные и передавать их в POST. Часть имени получает знак равенства, добавляемый, что приводит к name = urlencoded-file-content. Обратите внимание, что имя должно быть URL-адрес уже закодирован.

-121--108698-

Ну, после монкейминга с ним, это то, что я бы использовал:

 awk '{ print; system("sleep 0") }' edscript | tee /dev/tty | ed

или, без теэ :

awk '{ print >"/dev/stderr"; print | "ed"; system("sleep 0") }' edscript

Если print > «/dev/stderr » не работает в вашей системе, вы могли бы использовать print |« cat > & 2 ».


С gnu sed :

sed -u -n -e 'p;w /dev/stderr' -e 's|.*||e' edscript | ed

Другой способ, который также работает:
Используйте split для разделения edscript на каждой строке:

split -l1 edscript

это приведет к образованию частей, таких как xaa , xab ... xah .
Для получения ожидаемого результата можно использовать следующие элементы:

for i in x*; do awk '{ print >"/dev/stderr"; print }' $i; done | ed

или

for i in x*; do sed -n -e 'p;w /dev/stderr' $i; done | ed

. Тогда вы rm x * ...

4
27.01.2020, 20:24

Звучит так, как будто вы хотите смоделировать интерактивный терминальный сеанс, в котором пользователь вводит команду, ждет ответа (или, учитывая, что целью является ed, иногда ждет ответа), затем вводит другую команду и т. д. Можно написать скрипт expect для этого, но этого может быть достаточно, чтобы просто послать строку одновременно и терминалу, и целевому процессу, с короткой паузой между каждой строкой.

    $ while IFS= read -r line
      do
        printf '%s\n' "$line" >/dev/tty
        printf '%s\n' "$line"
        sleep 0.5
      done < helloworld | ed
a
hello
world
.
,n
1   hello
2   world
,s,o,O,g
,n
1   hellO
2   wOrld
Q

Чтобы лучше отличить ввод от вывода, можно добавить цвет или другую подсветку в
echo "$line" >/dev/tty строке, или, в данном конкретном случае, включить символ подсказки в команде ed (команда P) так, чтобы перед каждой командой * отображалась ed.

4
27.01.2020, 20:24

Я сделал кое-что ... сложное. Недавно я изучал ex / ed - я не очень хорошо разбираюсь в этом - и это дало возможность погрузиться немного глубже. Это сначала анализирует ed скрипт и передает его ed in-stream:

b='[:blank:]'
sed -e 'h;/\n/!i\' -e 0i -e 's/^\(.*[^\]\)*\(\\\\\)*\\$//;tn'"
/^\n*\([0-9;$,.$b]*[gGvV].*\\\\\n[$b]*\)*\([0-9,$.;${b}]*[aic][$b]*\)\
\(\n\(.*\)\n\.\)*\(\n.*\)*$/{ s//\4/;:n" -e 'G;//{N;D
    };g;s//\1\2/;l;x;s//\4/;l;H;s/.*/./;a\' -e '.
};l;g;i\' -e .\\ -e 1,.p\\ -e u <ed_script | ed

Он менее сложен, чем раньше - и теперь практически все сложности заключаются в одном регулярном выражении. охватывает две строки. Это одно длинное регулярное выражение выполняет практически все тестирование всего скрипта.

Идея заключается в том, что, насколько я могу судить, вы можете перейти в режим вставки только с одним из a ppend, i nsert или c команды изменения. режим вставки затем принимает весь ввод буквально до следующей встречающейся строки, состоящей только из . точка. Любая другая продолженная команда, которая охватывает несколько строк - даже последовательность таких, где задействованы G , g , V или v - обязательно продолжается до следующей строки с обратной косой чертой \ в конце - хотя, как обычно, обратная косая черта \ в этом контексте экранируется сама собой.

Хотя это вполне возможно, я ошибаюсь, но я думаю , что это обрабатывает все случаи. Для каждой строки ввода, которая не соответствует [aic] ... . dot series sed вставляет серию команд, которые выглядят так:

0i
command-line$
.
1,.p
u

...инструктируя ed i nsert l ook (как написано sed ) по его собственной команде, затем p отредактировать его и, наконец, u отменить всю операцию - что дает очень удобный результат выполнения редактирования, печати, реверсирования, и восстановление последнего адреса одним действием.

Для тех строк, которые совпадают с в последовательности либо завершающих обратных косых черт, либо [aic] ... . серия немного сложнее. В этих случаях sed рекурсивно втягивает их, пока не встретит конец серии, прежде чем выполнить l ок. Я был осторожен, чтобы отделить [aic] , . , и фактический буквальный ввод в отдельные распечатки - каждый из этих типов получит свое собственное l ook - так что буквальный ввод будет объединен как можно больше ( sed прервет вывод l ook на 80 символов по умолчанию) .

Думаю, проще просто показать вам. Вы заметите приглашение ? ниже - это происходит из-за того, что команда g , заданная до того, как это недопустимая команда, - не потому, что sed искажает ввод (Надеюсь) .Вот результат модифицированной версии вашего примера набора данных:

g \\\n  a$
hello\nworld\\\n\n  0a\n  world\\\nworld\nworld$
.$
?
,n$
1       hello
2       world\
3
4         0a
5         world\
6       world
7       world
,s,o,O,g$
4$
  0a
.,$n$
4         0a
5         wOrld\
6       wOrld
7       wOrld
,s,$,\\\n\\\n\\\\$
\
,n$
1       hellO
2
3       \
4       wOrld\
5
6       \
7
8
9       \
10        0a
11
12      \
13        wOrld\
14
15      \
16      wOrld
17
18      \
19      wOrld
20
21      \
Q$
3
27.01.2020, 20:24

Теги

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