Devolver una coincidencia de expresiones regulares en una escritura del golpe, en lugar de reemplazarla

StackOverflow https://stackoverflow.com/questions/1898553

  •  19-09-2019
  •  | 
  •  

Pregunta

Sólo quiero que coincida con algún texto en un script bash, i'v intentado usar sed, pero me parece que no puede hacerlo solo salidas de partido en lugar de reemplazarla con algo.

echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g'

¿Cuál es la salida: TestTdontReplaceString

Lo que no es lo que yo quiero, yo quiero que la salida: 100

Lo ideal es que me gustaría que poner todos los partidos en una matriz.

editar: la introducción de texto está llegando en forma de cadena:

newName()
{
 #Get input from function
 newNameTXT="$1"

 if [[ $newNameTXT ]]; then
 #Use code that im working on now, using the $newNameTXT string.

 fi
} 
¿Fue útil?

Solución

echo "TestT100String" | sed 's/[^0-9]*\([0-9]\+\).*/\1/'

echo "TestT100String" | grep -o  '[0-9]\+'

El método que se utiliza para poner los resultados en una matriz depende un poco de cómo se está recuperando los datos reales. No hay suficiente información en su pregunta sea capaz de guiarlo bien. Sin embargo, aquí es un método:

index=0
while read -r line
do
    array[index++]=$(echo "$line" | grep -o  '[0-9]\+')
done < filename

Aquí hay otra manera:

array=($(grep -o '[0-9]\+' filename))

Otros consejos

Usted puede hacer esto únicamente en bash utilizando el operador de la prueba [[ ]] soporte de doble cuadrado, que almacena los resultados en una matriz llamada BASH_REMATCH:

[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"

Pure Bash . Uso parámetro de sustitución (no hay procesos externos y tuberías):

string="TestT100String"

echo ${string//[^[:digit:]]/}

Elimina todos los no-dígitos.

El uso de grep. Sed es un editor. Si sólo desea para que coincida con una expresión regular, grep es más que suficiente.

usando awk

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100

No sé por qué nadie usa expr: es portátil y fácil

.
newName()
{
 #Get input from function
 newNameTXT="$1"

 if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
  echo "contains $num"
 fi
}

Sé que esto es un tema viejo, pero yo le llegué mismas búsquedas y encontramos otro gran posibilidad de aplicar una expresión regular en una cadena / variables con grep:

# Simple
$(echo "TestT100String" | grep -Po "[0-9]{3}")
# More complex using lookaround
$(echo "TestT100String" | grep -Po "(?i)TestT\K[0-9]{3}(?=String)")

Con el uso de las capacidades Lookaround expresiones de búsqueda se puede ampliar para una mejor representación. Donde (?i) indica el patrón antes de que el patrón buscado (búsqueda hacia delante), \K indica el patrón de búsqueda actual y (?=) contiene el patrón después de la búsqueda (búsqueda hacia atrás).

https://www.regular-expressions.info/lookaround.html

El ejemplo dado coincide con el mismo que el TestT([0-9]{3})String expresión regular PCRE

Bueno, la Sed con el s / "pattern1" / "patrón2" / g simplemente se cambia de una vez todos los pattern1s al patrón 2.

Además de eso, sed, mientras que de manera predeterminada imprimir toda la línea por defecto. Sugiero una tubería de la instrucción a un comando de corte y tratar de extraer los números u quiere:

Si u miráis sólo para usar sed luego usar TRE:

sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.

Me fuerza a tratar de ejecutar el comando anterior así que asegúrese de que la sintaxis es correcta. Espero que esto ayudó.

utilizando sólo el shell bash

declare -a array
i=0
while read -r line
do
        case "$line" in
            *TestT*String* )
            while true
            do
                line=${line#*TestT}
                array[$i]=${line%%String*}
                line=${line#*String*}
                i=$((i+1))
                case "$line" in
                    *TestT*String* ) continue;;
                    *) break;;
                esac
            done
            esac
done <"file"
echo ${array[@]}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top