regex - texto - Devuelva una coincidencia de expresiones regulares en un script BASH, en lugar de reemplazarlo
operadores logicos bash (8)
Bueno, el Sed con s / "pattern1" / "pattern2" / g simplemente reemplaza globalmente todos los pattern1s al patrón 2.
Además de eso, sed mientras que por defecto imprime la línea entera por defecto. Sugiero pasar la instrucción a un comando de corte e intentar extraer los números que quieres:
Si estás buscando solo usar sed, usa TRE:
sed -n ''s/.*/(0-9/)/(0-9/)/(0-9/).*//1,/2,/3/g''.
No intento y ejecuta el comando anterior, así que asegúrate de que la sintaxis sea la correcta. Espero que esto haya ayudado.
Solo quiero hacer coincidir un texto en una secuencia de comandos BASH, he intentado usar sed, pero parece que no puedo hacer que sea solo la salida en lugar de reemplazarlo con algo.
echo -E "TestT100String" | sed ''s/[0-9]+/dontReplace/g''
Que dará salida: TestTdontReplaceString
Que no es lo que quiero, quiero que salga: 100
Lo ideal sería que quisiera poner todas las coincidencias en una matriz.
Editar: La entrada de texto está entrando como una cadena:
newName()
{
#Get input from function
newNameTXT="$1"
if [[ $newNameTXT ]]; then
#Use code that im working on now, using the $newNameTXT string.
fi
}
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
}
Puede hacer esto puramente en bash usando el operador de prueba del corchete doble [[ ]]
, que almacena los resultados en una matriz llamada BASH_REMATCH
:
[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
Pure Bash . Utilice la sustitución de parámetros (sin procesos externos y tuberías):
string="TestT100String"
echo ${string//[^[:digit:]]/}
Elimina todos los no dígitos.
Utilice grep. Sed es un editor. Si solo quieres hacer coincidir una expresión regular, grep es más que suficiente.
usando awk
linux$ echo -E "TestT100String" | awk ''{gsub(/[^0-9]/,"")}1''
100
usando solo 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[@]}
echo "TestT100String" | sed ''s/[^0-9]*/([0-9]/+/).*//1/''
echo "TestT100String" | grep -o ''[0-9]/+''
El método que utilice para colocar los resultados en una matriz depende en cierto modo de cómo se recuperan los datos reales. No hay suficiente información en su pregunta para poder guiarlo bien. Sin embargo, aquí hay 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))