0

这个函数f()应该非常简单,但它的工作方式令人费解:

f() {
  a=(cyan red green blue orange violet)
  shopt -s extglob
  echo 1: -${a[@]/!($1)}-
  echo 2: -${a[@]/!($1)/}-
  echo 3: -${a[@]/!("$1")/}-
  echo 4: -"${a[@]/!($1)/}"-
  echo 5: -${a[@]/!($1)/x}-
}
echo ORANGE
f orange # ends in e like blue
echo YELLOW
f yellow

输出是(请同时注意空白/间距):

ORANGE
1: - e -
2: - e -
3: - e -
4: -    e -
5: -x x x x xe x-
YELLOW
1: - -
2: - -
3: - -
4: -     -
5: -x x x x x x-

为什么只搜索单词的最后一个字符?!(在这种情况eorange

期望的输出orange不仅仅是e

注意:我也希望在一些我看到一个空白的地方看不到空白..

4

1 回答 1

2

问题是模式没有锚定,例如对于orange,不匹配的最长字符串orangeorang。因此它被移除并且只e保留在那里。由于无法在 bash 中指定锚点,因此您必须自己创建它们:

#! /bin/bash
f() {
    a=(cyan red green blue orange violet '1 2')
    a=("${a[@]/#/|}")
    a=("${a[@]/%/|}")
    shopt -s extglob
    echo ["${a[@]/|!($1)|/-}"]
}
echo ORANGE
f orange # ends in e like blue
echo YELLOW
f yellow
于 2013-03-15T11:10:55.560 回答