Ajuda com a combinação de comandos sed (sintaxe)

Ajuda com a combinação de comandos sed (sintaxe)

Eu tenho um arquivo contendo muitas linhas, assim

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

Para substituir essas strings eu posso fazer

#!/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

ou acorrente-os, o que é tão ruim

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

Mas existe uma maneira de usar um único comando sed para realizar todas as iterações?

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

Responder1

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 ativa expressões regulares estendidas, que permitem o uso de (){}|metacaracteres sem escape.

  • (, ){,1}corresponde de 0 (implícito) a 1 ocorrência de ,.

  • \$(true|false)corresponde $trueou $false.


Ter em mente que

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

é um único comando sed, mas com vários scripts (um para cada -esinalizador).

informação relacionada