Tengo un problema complicado de expresiones regulares

Tengo la cuerda como abajo

some_Name   _  _Bday Date Comm.txt

Y aquí está mi expresión regular para que coincida con los espacios y subrayar

\_?\s\_?

Now when i try to replace the string using sed and the above regex

echo "some_Name   _  _Bday Date Comm.txt" | sed 's/\_?\s\_?/\_/g'

La salida que quiero es

some_Name_Bday_Date_Comm.txt

¿Alguna idea sobre cómo hago esto?

1
jhon.smith 12 dic. 2019 a las 16:31

2 respuestas

La mejor respuesta

Está utilizando un motor de expresión regular POSIX BRE con el patrón \_?\s\_? que coincide con un _?, un espacio en blanco (si su sed admite \s taquigrafía) y un _? subcadena, es decir, los ? se tratan como símbolos de signo de interrogación literales.

Puede usar

sed -E 's/[[:space:]_]+/_/g'
sed 's/[[:space:]_]\{1,\}/_/g'

Ver demostración en línea sed

El patrón [[:space:]_]+ POSIX ERE (habilitado con la opción -E) coincidirá con uno o más espacios en blanco o caracteres de subrayado.

El cuantificador POSIX ERE + se puede escribir como \{1,\} en POSIX BRE. Además, si usa un GNU sed, puede usar \+ en el segundo comando sed.

0
Wiktor Stribiżew 12 dic. 2019 a las 13:34

Esto podría funcionar para usted (GNU sed):

sed -E 's/\s(\s*_)*/_/g' file

Esto reemplazará un espacio seguido de cero o más de los siguientes: cero o más espacios seguidos de un guión bajo.

0
potong 13 dic. 2019 a las 09:07