fish: экранирование `^` в sed

#escaping #fish

#экранирование #fish

Вопрос:

В Fish shell попробуйте выполнить escape ^ в [^anything] sed , однако это не сработает.

Я пробовал использовать одинарные кавычки ( 's///' ), двойные кавычки ( "s///" , экранирование через одинарную или двойную косую черту ( / ), ничего не работает.

Я хотел бы найти решение как для одинарных , так и для двойных кавычек в sed command.

 $ echo 'cd $OLDPWD $argv' | sed $sed_options "s/cd ([^ ]) $argv/cd 1/g" -

$ echo 'cd $OLDPWD $argv' | sed $sed_options 's/cd ([^ ]) $argv/cd 1/g' -
  

Ответ №1:

В Fish shell попробуйте экранировать ^ в [^что угодно] в sed, однако это не работает.

Итак, дело в том, что вам не нужно экранировать ^ в интересах fish[0].

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

Например.

 echo abc | sed -e 's/[^a]/ /g'
  

заменит оба «b» и «c» на » «, потому что ни один из них не является «a».

Я хотел бы найти решение как для одинарных, так и для двойных кавычек в команде sed.

То же самое в одинарных и двойных кавычках.

 echo 'cd $OLDPWD $argv' | sed $sed_options "s/cd ([^ ]) $argv/cd 1/g"
  

[0] Технически версии до fish 3 использовали его для обозначения перенаправлений stderr, но только в начале токена и только вне кавычек. Ни один из которых здесь не применим.

Комментарии:

1. Ну, я попробовал это, и это не сработало. Я понятия не имею, как. Кстати, я установил Fish v3.0.2 в Termux. echo 'cd $OLDPWD $argv' | sed "s/cd ([^ ]) $argv/cd 1/g" - выводит cd $OLDPWD $argv . То же самое с одинарными кавычками.

2. sed Неверно другими способами — ([^ ]) это один символ . Это означает, что это должно было бы выглядеть как cd x $argv , чтобы соответствовать. Используйте ([^ ]*) «количество символов, которые не являются пробелом.