Как заменить символ в группе захвата на sed

Я предполагаю, что fcserver работает демонизированным - т.е. отключается от работающей оболочки, а ваша загрузочная программа - нет.

Что происходит, когда ваш скрипт запускается init, так это то, что он порождает новую оболочку (/bin/sh в вашем случае), запускает загрузку и fcserver в фоновом режиме в этой оболочке,... и затем уничтожает эту оболочку. , который неявно отправляет HUP всем дочерним процессам. Fcserver выживает, потому что он демонизирован, а загрузка — нет.

Вы можете попробовать добавить к вызову загрузки префикс nohup:

#! /bin/sh

nohup /home/pi/sketchbook/leds/loading/application.linux64/loading &
/usr/local/bin/fcserver &

Я не уверен, доступен ли nohup на вашем Raspberry Pi — мне нечего проверять.

1
23.08.2017, 05:13
2 ответа

Несколько способов сделать это; вот один из них:

sed -e ':a' -e 's_^\([^:]*\)\\_\1/_;t a'

Объяснение хлебных крошек:

-eуказывает команду редактирования. Здесь есть две такие команды.

:aопределяет метку, которую можно использовать в операторах "goto".

Команда sзаменяет первую обратную косую черту в строке прямой косой чертой, если первая обратная косая черта стоит перед любым двоеточием.

Команда t aпереходит к метке :aпри условии, что замена была успешно выполнена с помощью команды s. (Условное "перейти")

2
27.01.2020, 23:16

Использование awkвместо sed:

awk -v FS=':' -v OFS=':' '{ gsub(/\\/,"/",$1) } { print }'

Это обрабатывает данные как :-запись с разделителями и использует gsub(), чтобы заменить все обратные косые черты прямыми косыми чертами в первом поле. Затем он выводит измененные данные.

Я установил разделитель полей ввода ( FS) и разделитель полей вывода ( OFS) на :, чтобы ввод был разделен двоеточием и чтобы двоеточие позже снова вставлялось, когда происходит вывод.


Если у вас есть текст в переменной оболочки, вы можете сделать это непосредственно в оболочке без использования каких-либо внешних утилит:

a='a\b\c\d:text\text'
b=${a%%:*}  # the start of the string ("remove the first : and everything after it from $a")
c=${a#*:}   # the end of the string ("remove the first : and everything before it from $a")

a="${b//\\//}:$c"

printf '%s\n' "$a"

Этот фрагмент кода напечатает строку a/b/c/d:text \textв любой sh-оболочке, поддерживающей расширение параметра ${parameter//pattern/string}(расширение стандарта POSIX).

Это более или менее имитирует код awk.

3
27.01.2020, 23:16

Теги

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