escape специальный символ с использованием sed не работает

Я знаю, что об этом написано много вопросов, но я не работал для меня. Я работаю в bash и хотел бы заменить строку экранированными специальными символами:

echo "abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class," | sed -e "s#\([]*^+\.\$[-]\)##g"

Очевидно, что вывод был неправильным. Не могли бы вы предоставить мне правильную команду sed.

0
задан 25 July 2017 в 10:46

3 ответа

Ваше регулярное выражение неверно. Похоже, вы пытаетесь использовать \( \) для определения класса символов. Вы не можете. Это группы захвата, они позволяют ссылаться на то, что соответствовало им как \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\,
2
ответ дан 22 May 2018 в 20:12
  • 1
    Благодаря! он работает, но мы можем использовать это для всех escape-символов, например: '" `# $ & amp; *? [] & gt; {} \? – Soumali Chatterjee 25 July 2017 в 16:01
  • 2
    @SoumaliChatterjee, что вы имеете в виду? Вы пробовали это с этими персонажами, и это не удалось? – terdon♦ 25 July 2017 в 16:02
  • 3
    @SoumaliChatterjee echo ";'\"`#$&*?[]<>{}\ " | perl -ne 'print quotemeta' – terdon♦ 25 July 2017 в 16:06
  • 4
    Конечно, с моим тестовым примером, например String "abm1c / def / sdfd / sync / sdff.jar", или "abm1c / def / sdfd / " это не так. Я пытаюсь понять, может ли быть какой-то особый характер, который я упустил? благодаря – Soumali Chatterjee 25 July 2017 в 16:26
  • 5
    @SoumaliChatterjee никакой символ не является "специальным" в целом. Это всегда будет зависеть от того, где вы хотите их использовать. Но да, perl's quotemeta избежит всего, что не является простым символом слова ASCII (так что все, что не соответствует [A-Za-z_0-9]). – terdon♦ 25 July 2017 в 16:27

Ваше регулярное выражение неверно. Похоже, вы пытаетесь использовать \( \) для определения класса символов. Вы не можете. Это группы захвата, они позволяют ссылаться на то, что соответствовало им как \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\,
2
ответ дан 18 July 2018 в 09:44

Ваше регулярное выражение неверно. Похоже, вы пытаетесь использовать \( \) для определения класса символов. Вы не можете. Это группы захвата, они позволяют ссылаться на то, что соответствовало им как \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\,
2
ответ дан 24 July 2018 в 19:25

Другие вопросы по тегам:

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