Bash-Parametersubstitution (baparmsub?) funktioniert nicht

Bash-Parametersubstitution (baparmsub?) funktioniert nicht

[ mitbash -cx 'a="_IN_workstation"; b=${a/[a-zA-Z]*[a-zA-Z]/_};echo x.$bx' funktioniert teilweise, aber das Fehlen von Klammern verfälscht die Übereinstimmung. Dies deutet darauf hin, dass die Verarbeitung der Klammern das Problem ist, aber ich habe die Arbeit von gesehenGNU Autoconfwas auf etwas anderes hindeutet. Kennt sich jemand mit den internen Vorgängen bei Bash aus? ]

Ich habe ein Problem mit der Eingabe von Werten wie _PREROUTING _POSTROUTING, um alphabetische Zeichen zu entfernen:

a=${step/\_+([a-zA-Z]/\_}
[ note: replacing underscore with \x5f does nothing for the script although using sed works via 's/_[a-zA-Z][a-zA-Z]*/_/gp' but that is NOT what i __wanted__]   

(GNU)[https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html] scheint mir zuzustimmen, meine Bash (5.1) hat nichtShop +patsub_replacementverfügbar für 5.2.

Linux Mint Version und Bash Version sieheSchrittVariable und [Originalskript in]
(Bash hat Probleme mit cmdline nft cmd vs script)

Ich habe es versucht [:alpha:], aber beides funktioniert nicht im Skript und selten in der Befehlszeile.

Antwort1

Sie müssen es verwenden shopt -s extglob, was normalerweise onfür interaktive Shells, aber offin Skripts der Fall ist.

#!/bin/bash
shopt -s extglob

step=_SOME_under_SCORES
a=${step//_+([a-zA-Z])/_}

echo "[$step]=>[$a]"
$ ./check.sh
[_SOME_under_SCORES]=>[___]

Siehe man bashSektionMustervergleich:

Wenn dasextglob Die Shell-Option wird mithilfe des integrierten Shopt aktiviert. Mehrere erweiterte Mustervergleichsoperatoren werden erkannt […]

Antwort2

Die Maschinengötter haben anscheinend genug Zeit damit verbracht, mich auszulachen. Ich glaube, Alexey Ten hat wesentlich zur Antwort beigetragen.

y= ${Schritt//_[[:alpha:]]+([[:alpha:]])/_}

verwandte Informationen