Я знаю, что об этом написано много вопросов, но я не работал для меня. Я работаю в bash и хотел бы заменить строку экранированными специальными символами:
echo "abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class," | sed -e "s#\([]*^+\.\$[-]\)##g"
Очевидно, что вывод был неправильным. Не могли бы вы предоставить мне правильную команду sed.
Ваше регулярное выражение неверно. Похоже, вы пытаетесь использовать \( \) для определения класса символов. Вы не можете. Это группы захвата, они позволяют ссылаться на то, что соответствовало им как \1 (или \2, \3 для последующих групп). Класс символов определяется с помощью []. То, что вы хотите сделать, - это захватить любое совпадение класса символов, чтобы заменить его самим escaped:
$ echo 'abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class,' |
sed -e 's#\([]*^+.$[/]\)#\\\1#g'
Обратите внимание, что вам необходимо, чтобы ] был первым символом в классе символов. В противном случае предполагается, что это закрывающая скобка. И вам не нужно бежать . или $, когда они находятся в классе символов.
Наконец, вы могли бы сделать это проще, используя perl's quotemeta:
$ echo 'abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class,' |
perl -lne 'print quotemeta()'
abm1c\/def\/sdfd\/sync\/sdff\.jar\/rtets\.jar\/fg\/gdf\/ggdg\/dg\/adg\/TextParser\$2\.class\,
Ваше регулярное выражение неверно. Похоже, вы пытаетесь использовать \( \) для определения класса символов. Вы не можете. Это группы захвата, они позволяют ссылаться на то, что соответствовало им как \1 (или \2, \3 для последующих групп). Класс символов определяется с помощью []. То, что вы хотите сделать, - это захватить любое совпадение класса символов, чтобы заменить его самим escaped:
$ echo 'abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class,' |
sed -e 's#\([]*^+.$[/]\)#\\\1#g'
Обратите внимание, что вам необходимо, чтобы ] был первым символом в классе символов. В противном случае предполагается, что это закрывающая скобка. И вам не нужно бежать . или $, когда они находятся в классе символов.
Наконец, вы могли бы сделать это проще, используя perl's quotemeta:
$ echo 'abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class,' |
perl -lne 'print quotemeta()'
abm1c\/def\/sdfd\/sync\/sdff\.jar\/rtets\.jar\/fg\/gdf\/ggdg\/dg\/adg\/TextParser\$2\.class\,
Ваше регулярное выражение неверно. Похоже, вы пытаетесь использовать \( \) для определения класса символов. Вы не можете. Это группы захвата, они позволяют ссылаться на то, что соответствовало им как \1 (или \2, \3 для последующих групп). Класс символов определяется с помощью []. То, что вы хотите сделать, - это захватить любое совпадение класса символов, чтобы заменить его самим escaped:
$ echo 'abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class,' |
sed -e 's#\([]*^+.$[/]\)#\\\1#g'
Обратите внимание, что вам необходимо, чтобы ] был первым символом в классе символов. В противном случае предполагается, что это закрывающая скобка. И вам не нужно бежать . или $, когда они находятся в классе символов.
Наконец, вы могли бы сделать это проще, используя perl's quotemeta:
$ echo 'abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class,' |
perl -lne 'print quotemeta()'
abm1c\/def\/sdfd\/sync\/sdff\.jar\/rtets\.jar\/fg\/gdf\/ggdg\/dg\/adg\/TextParser\$2\.class\,