Экранирование ' (одинарная кавычка) в строке замены sed

Поскольку вы имеете дело с довольно статической частью информации (, за исключением дополнительных вложенных событий ), просто используйте встроенные -в командах оболочки:

function capdate() {
  case "$1" in
  (01) printf "JAN";;
  (02) printf "FEB";;
  (03) printf "MAR";;
  (04) printf "APR";;
  (05) printf "MAY";;
  (06) printf "JUN";;
  (07) printf "JUL";;
  (08) printf "AUG";;
  (09) printf "SEP";;
  (10) printf "OCT";;
  (11) printf "NOV";;
  (12) printf "DEC";;
  (*)  printf "invalid"; return 1;;
  esac
}

Пробный запуск:

$ m=$(capdate 01); echo $?, $m
0, JAN
$ m=$(capdate Caesar); echo $?, $m
1, invalid

Измените текст, если в вашей локали другие date +%bназвания.

0
18.09.2019, 17:46
2 ответа

закройте одинарную кавычку, в которую вы помещаете регулярное выражение, измените одинарную кавычку и снова откройте ее

$ echo "a'b" | sed 's/'\''/X/'
aXb

$ echo "aXb" | sed 's/X/'\''/'
a'b
1
28.01.2020, 03:16

Вам не нужно экранировать в sed, где 'не имеет особого значения. Вам нужно избежать его в bash.

$ sed -e "s/'/singlequote/g" <<<"'"
singlequote

Здесь видно, что двойные кавычки защищают одинарную кавычку от bash, и sed справляется с этим. Вот что происходит, когда вы переключаете одинарные кавычки.

$ sed -e 's/'/singlequote/g' <<<"'"
>

Странная вещь о 'в бурне, как снаряды (все? )заключается в том, что он действует не столько как ", сколько как флаг, отключающий интерпретацию других символов, пока не будет замечен другой '. Если вы заключите его в двойные кавычки, это не будет иметь особого значения. Соблюдайте:

$ echo 'isn'"'"'t this hard?'
isn't this hard?

Вы также можете использовать обратную косую черту, как показано в другом ответе. Но вы должны оставить блок с одинарными кавычками, прежде чем это сработает. Так что пока кажется, что это сработает:

echo '\''

нет; первый 'отключает значение символа \.

Я предлагаю вам использовать другой подход. sedвыражения могут быть указаны как аргументы командной строки -, но за счет выхода из оболочки. Неплохо избежать короткого и простого выражения sed, но ваше довольно длинное и содержит много специальных символов.

Я бы поместил вашу команду sedв файл и вызвал sedс аргументом -f, чтобы указать командный файл, а не указывать его в командной строке.http://man7.org/linux/man-pages/man1/sed.1.htmlили man sed. Таким образом, команды sedне являются частью того, что видит оболочка (, она видит только имя файла ), и загадка выхода из оболочки исчезает.

$ cat t.sed
s/'*/singlequote(s)/g

$ sed -f t.sed <<<"' ' '''"
singlequote(s) singlequote(s) singlequote(s)
3
28.01.2020, 03:16

Теги

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