termina solo regulares regular numeros linea inicio expresiones expresion especiales espacio ejemplos consecutivos con caracteres blanco alfanumerico regex sed replace multiline

solo - regex inicio de linea



sed-¡Obtenga solo la cadena reemplazada de una entrada multilínea y omita las líneas no coincidentes! (3)

sed -n ''/^Important1.*$/s/^Important1: */b/(.*/)/b *//1/p''

Prueba de concepto

$ echo -e "Bla/nBla/nImportant1: One /nBla/nImportant2: Two/nBla/nBla" | sed -n ''/^Important1.*$/s/^Important1: */b/(.*/)/b *//1/p'' One

Quiero que sed omita todas las líneas que no coinciden, y solo muestra la cadena reemplazada (de la / s línea / s única / múltiple).

En otras palabras: tengo una pila de heno, y solo quiero que se devuelva la aguja, no todo el heno que se buscó y que permaneció inalterado.

O bien, en otras palabras, busque / reemplace una cadena descrita por RegEx en una cadena de varias líneas, y solo obtenga esa cadena devuelta. (Como es posible con la función PHP http://www.php.net/manual/en/function.preg-replace.php )

Mi solución actual es primero filtrar con grep, y luego canalizar solo las líneas correspondientes en sed para su reemplazo:

echo -e "Bla/nBla/nImportant1: One /nBla/nImportant2: Two/nBla/nBla" | egrep "^Important1.*$" | sed -E "s/^Important1: */b(.*)/b *//1/g" # From the multiple line input I only want the "One One" (with pre/post whitespace removed, hence matching the word boundaries with "/b") # And I want no "Bla bla" lines in the result!

Pero me gustaría tener una única solución dentro de sed . ¿O está fuera del uso previsto de sed y, por lo tanto, debería utilizar mejor otra cosa? Por cierto, problema: el sedimento multilínea usando referencias atrás parecía estar relacionado de alguna manera, ¡pero no estoy seguro!


Este comando sed hace lo que hace tu combinación de egrep y sed:

echo -e "Bla/nBla/nImportant1: One /nBla/nImportant2: Two/nBla/nBla" | sed -n -e "s/^Important1: */b/(.*/)/b *//1/p"

Realiza la sustitución y solo imprime las líneas que coinciden, después de la sustitución.


EDITAR: A continuación se probó en Mac y Linux.

Puedes usar sed así:

echo -e "Bla/nBla/nImportant1: One /nBla/nImportant2: Two/nBla/nBla" | / sed -n ''s/^Important1: */([^ ]*/) *//1/p'' OUTPUT: one

Explicación

sed -n ''s/^Important1: */([^ ]*/) *//1/p'' -n # quiet / silent { s/^Important1: */([^/ ]*/) *//1/ # replace "Important1: one " with 1st group i.e. "one" p # print the replaced text }