sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'
У меня есть это сообщение об ошибке:
sed: -e expression, char 20: unterminated `s' command
Пожалуйста, как мне исправить команду sed?
sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'
У меня есть это сообщение об ошибке:
sed: -e expression, char 20: unterminated `s' command
Пожалуйста, как мне исправить команду sed?
$ 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 \'. Если вы потеряли трек, включен он или выключен, добавьте пробел, посмотрите, не делает ли он новый параметр или нет.
Вам нужно будет экранировать одинарные кавычки в команде sed s
:
sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: '\''Test Cluster1'\''/'
Редактировать одинарные кавычки часто сложно. Везде, где есть строка в кавычках, которую вы заменяете на '\''
я постараюсь объяснить, как это работает - не стесняйтесь, кто-нибудь может улучшить это!
'\''
- первая кавычка заканчивается строкой sed, а последующие обрабатываются оболочкой. Обратная косая черта отображает символ, который следует за простым символом (а не метасимволом). Окончательная цитата затем завершает раздел интерпретации bash, и последующее анализируется с помощью sed
.