Usuń określone słowo ze zmiennej

23

W bashskrypcie, jak mogę usunąć słowo z łańcucha, słowo to zostanie zapisane w zmiennej.

FOO="CATS DOGS FISH MICE"
WORDTOREMOVE="MICE"
danm
źródło

Odpowiedzi:

30

Próbować:

$ printf '%s\n' "${FOO//$WORDTOREMOVE/}"
CATS DOGS FISH

To działa również w ksh93, mksh, zsh.


POSIXLY:

FOO="CATS DOGS FISH MICE"
WORDTOREMOVE="MICE"

remove_word() (
  set -f
  IFS=' '

  s=$1
  w=$2

  set -- $1
  for arg do
    shift
    [ "$arg" = "$w" ] && continue
    set -- "$@" "$arg"
  done

  printf '%s\n' "$*"
)

remove_word "$FOO" "$WORDTOREMOVE"

Zakłada, że ​​słowa są rozdzielane spacjami i ma efekt uboczny, który usuwa spacje przed i po "$WORDTOREMOVE".

Cuonglm
źródło
17

Korzystanie z zamiany podciągów bash:

FOO = $ {FOO // $ WORDTOREMOVE /}

// zastępuje wszystkie wystąpienia podłańcucha ($ WORDTOREMOVE) zawartością między / a}. W tym przypadku nic.

Aby uzyskać informacje na temat tego i innych sposobów pracy z ciągami w bash, zobacz sekcję 10.1. Manipulowanie ciągami w Advanced Bash-Scripting Guide .

Jan
źródło