Sintaxis de Bash Regex para excluir todo con: espacio: ¿Al final de la cadena?

¿Cómo hago para que esto sea verdadero solo para todos los números o caracteres al final de $trig_chars var excepto un espacio?

Ejemplos: trig_chars='--'. Coincidencia: --a --ab --abc --123. Pero no haga coincidir --[espacio] (-- seguido de un espacio).

    local compare_scan_text=${scan_text:0:$trig_chars_len}

    if [[ "$compare_scan_text" =~ "$trig_chars"[^ ]* ]]; then # Trig char forward hit.

        local l=${#hotstring}
        local scan_text=${scan_text:$l} # Remove chars & hotscan_texts from scan_text.
        local hotstring=${hotsring:$trig_chars_len} # Remove trig chars.

        hotstrings+=("$hotstring") # Update hotsrings list
    fi
Answer

Entrada de ejemplo:

compare_scan_text="--a -- why -not ---me? --ab --abc --{xyz}"
  • con GNU grep:
grep -Po '(?<=^|\s)--[^\s-]+' <<< "$compare_scan_text"
  • con POSIX awk:
awk '{for (i = 1; i <= NF; i++) if ($i ~ /^--[^-]/) print $i}' <<< "$compare_scan_text"

salidas:

--a
--ab
--abc
--{xyz}

Respondiendo al comentario:

Aquí la grepsolución es solo para (casi) Linux, mientras que la awkúnica es para todos los sistemas operativos compatibles con POSIX (lo que significa casi todos los sistemas operativos); así que personalmente elegiría awk.

En términos de gastos generales, en términos generales, al llamar a un comando externo, debe asegurarse de usarlo fuera del readciclo (en lugar de llamarlo para cada línea dentro del ciclo):

NO HAGAS ESTO :

#!/bin/bash

hotstrings=()

while IFS='' read -r line
do
    IFS=$'\n' read -r -d '' -a matches < <(
        awk '{for (i = 1; i <= NF; i++) if ($i ~ /^--[^-]/) print $i}' <<< "$line"
    )
    hotstrings+=( "${matches[@]}" )
done < file.txt

HAZ ESTO EN SU LUGAR:

#!/bin/bash

# bash version < 4
IFS=$'\n' read -r -d '' -a hotstrings < <(
    awk '{for (i = 1; i <= NF; i++) if ($i ~ /^--[^-]/) print $i}' < file.txt
)

# bash version >= 4
mapfile -t hotstrings < <(
    awk '{for (i = 1; i <= NF; i++) if ($i ~ /^--[^-]/) print $i}' < file.txt
)

# bash version >= 4.3
readarray -d '' -t hotstrings < <(
    awk '{for (i = 1; i <= NF; i++) if ($i ~ /^--[^-]/) printf "%s%c", $i, 0}' < file.txt
)

if [[ $compare_scan_text =~ ^"$trig_chars"(.*[^ ]$|$) ]] ; then

es decir, $trig_chars puede ir seguido de cualquier cosa si el último carácter no es un espacio, o puede ir seguido de nada.

Al citar la variable, los caracteres se interpretan literalmente.