.png)
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
-E
flag 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$true
ou$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 -e
sinalizador).