如何从变量中替换子串?

Modified on: Sat, 30 Jun 2018 12:13:30 +0800

我正在尝试从字符串变量中删除字符。它适用于sed,如下所示:

MYVAR=--23ho02123ware38384you443d34o3434ingtod38384day-%§*#sfrf echo ${MYVAR} | sed -e 's/[a-z][a-z0-9\-]*//g'

我得到了:

MYVAR=--23ho02123ware38384you443d34o3434ingtod38384day-%§*#sfrf
echo ${MYVAR} | sed -e 's/[a-z][a-z0-9\-]*//g'

这就是我要找的。字符串应以字母开头,并且只包含字母,数字和短划线( - )。
有没有办法用bash字符串替换来实现这个目的?

 --23%§*#

我尝试了几种组合,但没有一种能像我预期的那样工作。

作者:Barun,dings

最佳答案

你需要使用ksh扩展的glob操作符(bash中有shopt -s extglobzsh的子集) code> with set -o kshglob)来获得正则表达式的等价物(虽然使用不同的语法:*(x),相当于x*

shopt -s extglob # for bash
# set -o kshglob # for zsh
printf '%s\n' "${MYVAR//[[:alpha:]]*([[:alnum:]-])/}"

或者使用zsh extendedglob,其中等效的regexp *#

set -o extendedglob
printf '%s\n' ${MYVAR//[[:alpha:]][[:alnum:]-]#}

一些注意事项:

  • ${var/pattern/replacement}仅替换第一次出现。使用${var//pattern/replacement}替换每次出现(例如gsed标志/ code> command)。
  • 你替换了空格角色。使用s(或${var//pattern/})替换为空字符串。
  • 您不想使用${var//pattern}输出任意字符串
  • echo除外,列表上下文中的变量扩展必须引用
  • 当变量包含换行符时,与zsh方法相比,行为会有所不同。
  • sed匹配[a-z]a之间的字符(某些工具中的整理元素),其列表因区域设置而异,GNU系统上的z区域设置中的系统和工具(例如[a-z]bash-4.3匹配en_GB.UTF-8AXé,但不是)。这通常包括26个小写字母的英文字母,但不一定。 Z包括您的语言环境中被视为字母(无论大小写)的字符(或整理元素)。如果您只想匹配26个英文字母,请使用[[:alpha:]]或将语言环境修复为[abcdefghijklmnopqrstuvwxyz]C)并使用LC_ALL=C[a-z]仅用于小写英文字母或[[:lower:]] / [a-zA-Z]
  • [[:alpha:]]中的
  • [a-z0-9\-]与反斜杠字符匹配,使用sed相反([a-z0-9-]必须是字面上的第一个或最后一个)。

相关问答

添加新评论