Devolver una coincidencia de expresiones regulares en una escritura del golpe, en lugar de reemplazarla
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
}
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[@]}