Eu quero executar um script de shell enquanto ignoro alguns dos comandos, porque eles precisam de privilégios. Comandos como insmod
. Então eu filtro o script com isso e funciona (esses comandos são substituídos por true
):
sed -e 's/command1/true/g' -e 's/command2/true/g' -e 's/command3/true/g' ... -e 's/commandN/true/g'
Existe uma maneira mais concisa de expressar isso?
Com caracteres simples, para mudar 'a', 'b' e 'm' por 'x' eu poderia fazer algo como:
sed -e 's/[abm]/x/g'
ou
tr abm x
(ou seu tr abm '[x*]'
equivalente POSIX). Mas com cordas?
Se você
sed
for capaz de usar a-E
opção não padrão para entender expressões regulares estendidas, você pode usarA alternância com
|
é um recurso de expressão regular estendido não suportado pela expressão regular básica do tipo quesed
normalmente suporta.O
sed
comando acima substituiria qualquer uma das três strings fornecidas, mesmo que ocorressem como substrings de outras strings (comostring1
emstring10
).Para evitar isso, também corresponda os limites das palavras em ambos os lados:
No macOS, você pode usar
[[:<:]]
e[[:>:]]
no lugar de\<
e\>
especificar limites de palavras.Como um aparte, sua
s/[a|b|m]/x/g
expressão (agora corrigida na pergunta) não apenas substituiria e pora
, mas também substituiria qualquer no texto por . Isso é o mesmo que ou , ou os comandos e .b
m
x
|
x
s/[abm|]/x/g
y/abm|/xxxx/
tr
tr 'abm|' 'xxxx'
tr 'abm|' '[x*4]'
É isso que você está procurando? Com GNU
sed
:POSIXly, você pode usar
awk
:(
sed -E
é provável que seja especificado no próximo major do padrão POSIX , portanto, provavelmente se espalhará para a maioria das implementações eventualmente).