Предполагается, что оболочка csh
:
Чтобы просто добавить строку после другой:
% sed '/line2/a\\
# new line here\
' file
line1
line2
# new line here
line3
line4
Чтобы вставить строку перед другой:
% sed '/line3/i\\
# new line here\
' file
line1
line2
# new line here
line3
line4
Замена строки двумя новыми строками с помощью команды s
:
% sed 's/line2/&\\
# new line here/' file
line1
line2
# new line here
line3
line4
Протестировано на OpenBSD 6.1 с запущенными sed
и csh
из базовой системы.
Из раздела "ОШИБКИ" в самом конце руководства bash
:
There may be only one active coprocess at a time.
Q1: Is it possible to have multiple coprocesses running at the same time?
В Bash v4 и выше (, включая текущую v5 ), официально нет, как отмечает @Kusalananda.
Тем не менее, я могу сказать вам, что это может работать, несмотря на предупреждение, но, конечно, без гарантии и YMMV. Подробнее см. здесь .
Q2: If so, how should the script above be modified to achieve the desired output?
Это может(как описано выше )работать нормально, как только вы исправите:
exec {INNER_READER}<&"{INNER[0]}" # <-- lacks the '$' sign for the 'INNER[0]' variable
, что вызывает:
./coproctest.sh: line 19: INNER_READER: ambiguous redirect
сообщение и, следовательно, также:
./coproctest.sh: line 21: read: : invalid file descriptor specification
сообщение.
Это работает для меня, как только это было исправлено и предупреждение в сторону.
Что касается других примечаний:
coproc
файла -, если только вы не хотите передать их дочернему процессу (вспомогательной -оболочке, команде или сценарию)seq
естественным образом завершилась быстро, и поэтому автоматические переменные исчезли до того, как вы смогли их использовать. Поступая так, как вы, эти повторяющиеся файловые дескрипторы -будут унаследованы всеми последующими командами и фоновыми процессами, что может быть нежелательно, если ваш процесс co -фактически использует свой входной канал и ожидает его закрытия, чтобы выйти. Таким образом, другой подход к адресу, который основан на механизме синхронизации, например, сделайте ваш процесс OUTER
co -равным { seq 3; exec >&-; read; }
, а затем, когда вы использовали его ввод из основного сценария, выполните, например. echo >&${OUTER[1]}; wait "${OUTER_PID}"
чтобы позволить со -процессу read
продолжаться, а затем wait
для него. Обратите внимание, что не гарантируется, что wait
будет выполнено до того, как переменная $OUTER_PID
исчезнет :, в таком случае вы можете просто отключить предупреждающее сообщение (или полностью проигнорировать его )и, возможно, принудительно установить статус успеха с помощью|| true
coproc
с использованием синтаксиса Bash v3 поверх фоновых процессов плюс mkfifo
именованные -FIFO, а также в Linux с уловкой с заменой процессов вместо mkfifo
с. С синтаксисом Bash v4 это может быть менее сложным, но все же сложным упражнением.