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
}