Поскольку вы имеете дело с довольно статической частью информации (, за исключением дополнительных вложенных событий ), просто используйте встроенные -в командах оболочки:
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
названия.
закройте одинарную кавычку, в которую вы помещаете регулярное выражение, измените одинарную кавычку и снова откройте ее
$ echo "a'b" | sed 's/'\''/X/'
aXb
$ echo "aXb" | sed 's/X/'\''/'
a'b
Вам не нужно экранировать в 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)