Следующий код поможет мне составить список установленных лицензий для различных приложений в Ubuntu 15.04.
find /usr/share/doc -type f -name copyright -exec grep "License\:" {} + | cut -f3 -d: | sort -u
Фактическая ошибка возникает из-за того, что произвольный символ-разделитель может использоваться для разграничения регулярного выражения при использовании в качестве адресов строк путем добавления перед символом-разделителем обратной косой черты, как в
\@hello@d
, который удалит каждую строку, соответствующую регулярному выражению hello
, точно так же, как
/hello/d
будет.
Однако символы новой строки нельзя использовать в качестве разделителя таким образом. Отсюда ошибка.
Сценарию sed
не нужны экранированные символы новой строки, так как все они заключены в одну строку в кавычках. Удалите \
в конце каждой строки фактического sed
сценария редактирования :
sed -e 's|$API_URL|$(API_URL)|g
s|$API_KEY|$(API_KEY)|g
s|$API_SECRET|$(API_SECRET)|g
s|$API_SALT|$(API_SALT)|g
s|$STORAGE_FUNCTION|$(STORAGE_FUNCTION)|g
s|$STORAGE_ACCOUNT|$(STORAGE_ACCOUNT)|g
s|$STORAGE_CONTAINER|$(STORAGE_CONTAINER)|g' \
infile >outfile
Обратите внимание, что ;
между операторами заменены символами новой строки. Они нужны только между утверждениями, занимающими одну строку, как, например, в G;s/\n/ /
.
В качестве альтернативы:
sed -e 's|$API_URL|$(API_URL)|g' \
-e 's|$API_KEY|$(API_KEY)|g' \
-e 's|$API_SECRET|$(API_SECRET)|g' \
-e 's|$API_SALT|$(API_SALT)|g' \
-e 's|$STORAGE_FUNCTION|$(STORAGE_FUNCTION)|g' \
-e 's|$STORAGE_ACCOUNT|$(STORAGE_ACCOUNT)|g' \
-e 's|$STORAGE_CONTAINER|$(STORAGE_CONTAINER)|g' \
infile >outfile
Или,
sed "s/'\\$\([^']*\)'/'\$(\1)'/g" infile >outfile
, чтобы заменить все, что похоже на '$something Whatever'
на '$(something Whatever)'
.
Или,
sed 's/$\([A-Z_]*\)/$(\1)/g' infile >outfile
, чтобы заменить вещи, похожие на $SOME_THING
, на $(SOME_THING)
(, немного более строгие в отношении разрешенных символов в именах переменных, но не заботящиеся об одинарных кавычках ).