Ayuda para combinar comandos sed (sintaxis)

Ayuda para combinar comandos sed (sintaxis)

Tengo un archivo que contiene muchas líneas, así

, foo = $true
, foo = $false
foo = $true, <--- single space after comma
foo = $false, <-- single space after comma

Para reemplazar estas cadenas puedo hacer

#!/bin/bash

sed -i 's/, foo = $true/bar/g' file
sed -i 's/, foo = $false/bar/g' file
sed -i 's/foo = $true, /bar/g' file
sed -i 's/foo = $false, /bar/g' file

o encadenarlos que es igual de malo

sed -i -e 's/, foo = $true/bar/g' -e 's/, foo = $false/bar/g' -e 's/foo = $true, /bar/g' ... file

Pero, ¿hay alguna forma de utilizar un único comando sed para realizar todas las iteraciones?

sed -i 's/[,\ ].*foo = [$false\|$true][,\ ]/bar/g' file

Respuesta1

sed -Ei 's/,{,1} {,1}foo = \$(true|false),{,1} {,1}/bar/g' file
sed -Ei 's/(, ){,1}foo = \$(true|false)(, ){,1}/bar/g' file

-Eflag activa expresiones regulares extendidas, que permiten el uso de (){}|metacaracteres sin escape.

  • (, ){,1}coincide con 0 (implícito) y 1 apariciones de ,.

  • \$(true|false)coincidencias $trueo $false.


Tener en cuenta que

sed -i -e 's/, foo = $true/bar/g' -e 's/, foo = $false/bar/g' -e 's/foo = $true, /bar/g' ... file

Es un comando sed único, pero con varios scripts (uno para cada -ebandera).

información relacionada