Ошибка многострочного сценария sed: новую строку нельзя использовать в качестве разделителя строк

Следующий код поможет мне составить список установленных лицензий для различных приложений в Ubuntu 15.04.

find /usr/share/doc -type f -name copyright -exec grep "License\:" {} + | cut -f3 -d: | sort -u
1
23.02.2019, 01:13
1 ответ

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

\@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)(, немного более строгие в отношении разрешенных символов в именах переменных, но не заботящиеся об одинарных кавычках ).

2
27.01.2020, 23:30

Теги

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