2
sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'

У меня есть это сообщение об ошибке:

  sed: -e expression, char 20: unterminated `s' command

Пожалуйста, как мне исправить команду sed?

2 ответа2

7
$ sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/"

или же

sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'Test' 'Cluster1\'/

Тот, у которого были все одинарные кавычки, было сложнее построить без этой программы. Если вам нужна помощь в получении правильной команды, есть программа на C, которую вы можете использовать.

$ cat w.c
#include <stdio.h>

int main(int argc, char *argv[]) {
        int i = 0;
        while (argv[i]) {
                printf("argv[%d] = %s\n", i, argv[i]);
                i++;
        }
        return 0;
}

Я тестирую от Cygwin, но любая оболочка * nix должна быть такой же

Вы видите это работает

$ ./w sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Clust
er1'/"
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/


$

Принимая во внимание, что если вы попробуете тот из подозреваемого

sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test Cluster1\'/'

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

Его даже не казнят

$ ./w  sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test C
luster1\'/'
>CTRL-C

Потому что в нем отсутствует единственная цитата

$ ./w 'fgg
>

среди, возможно, других проблем.

И если вы посмотрите на один из подозреваемых, он терпит неудачу даже в начале, он ломается в пространстве

$ ./w  sed -e 's/cluster_name: \'Test Clu
argv[0] = f:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: \Test
argv[4] = Clu

Это работает

$ ./w  sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'
Test' 'Cluster1\'/
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/

Когда вы сложите это вместе, вы можете попробовать добавить пробел и символ, а затем вы увидите, включен ли режим цитаты. Если он выключен, то если вы хотите экранировать одинарную кавычку, используйте \'Если он включен, выключите его с помощью' then do \'. Если вы потеряли трек, включен он или выключен, добавьте пробел, посмотрите, не делает ли он новый параметр или нет.

2

Вам нужно будет экранировать одинарные кавычки в команде sed s :

sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: '\''Test Cluster1'\''/'

Редактировать одинарные кавычки часто сложно. Везде, где есть строка в кавычках, которую вы заменяете на '\'' я постараюсь объяснить, как это работает - не стесняйтесь, кто-нибудь может улучшить это!

'\'' - первая кавычка заканчивается строкой sed, а последующие обрабатываются оболочкой. Обратная косая черта отображает символ, который следует за простым символом (а не метасимволом). Окончательная цитата затем завершает раздел интерпретации bash, и последующее анализируется с помощью sed .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .