使用正则表达式 (bash) 修改 shell 变量

Vai*_* MK 3 bash string shell-script regular-expression variable-substitution

例如,我有一个 shell 变量。一个=“大小人”。如何在 bash 中使用正则表达式打印出只有中间单词大写的变量?(大个子)

我可以通过将变量分成 3 个变量然后在 echo 中扩展它们来实现。例如first=${a%* },等等。但是我如何使用一个正则表达式一次性完成?

是否可以在一行中完成?使用大写运算符 (^)

und*_*cat 5

sed

假设您使用的是 GNU sed:

$ sed -E 's/(\w+) (\w+) (\w+)/\1 \U\2\E \3/' <<< 'big little man'
big LITTLE man
Run Code Online (Sandbox Code Playgroud)

此命令使用GNU 特定序列 \U\E并将后续字符分别转换为大写和取消大小写转换。

awk

虽然不操作正则表达式,但awk提供了另一种方便的方法来大写单个单词:

$ awk '{print($1, toupper($2), $3)}' <<< 'big little man'
big LITTLE man
Run Code Online (Sandbox Code Playgroud)

猛击

尽管 Bash 本身没有基于正则表达式的转换,但您仍然可以通过将字符串视为数组来实现部分大写,例如

$ (read -a words; echo "${words[0]} ${words[1]^^} ${words[2]}") <<< 'big little man'
big LITTLE man
Run Code Online (Sandbox Code Playgroud)

这里^^将数组的第二个元素(即第二个单词)转换为大写。该功能是在 Bash 4 中引入的。


Kus*_*nda 5

根据要求,bash使用以下命令在一行中执行此操作${variable^^}

$ a="big little man"
$ [[ "$a" =~ ^([^ ]+)\ ([^ ]+)\ (.*) ]] && a="${BASH_REMATCH[1]} ${BASH_REMATCH[2]^^} ${BASH_REMATCH[3]}"
$ echo "$a"
big LITTLE man
Run Code Online (Sandbox Code Playgroud)

这将正则表达式([^ ]+)\ ([^ ]+)\ (.*)与 中的字符串进行匹配$a。如果匹配,则它包含三个用空格分隔的子字符串。第一个和第二个子字符串将是不包含空格的任何字符串,第三个子字符串将是字符串的剩余位。

如果表达式匹配,$a则使用大写的第二个子字符串重写该值。

这假设原始字符串以非空格字符开头。