Existem dois níveis de interpretação aqui: o shell e sed.
No shell, tudo entre aspas simples é interpretado literalmente, exceto pelas própriaspas simples. Você pode efetivamente ter uma única aspa entre aspas simples escrevendo '\''
(feche aspas simples, uma aspa simples literal, abra aspas simples).
Sed usa expressões regulares básicas . Em um BRE, para que eles sejam tratados literalmente, os caracteres $.*[\]^
precisam ser citados precedendo-os por uma barra invertida, exceto dentro de conjuntos de caracteres ( […]
). Letras, dígitos e (){}+?|
não devem ser citados (você pode usar algumas dessas citações em algumas implementações). As sequências \(
, \)
, \n
e, em algumas implementações, \{
, \}
, \+
, \?
, \|
e outras barras invertidas + alfanuméricos têm significados especiais. Você pode sair sem citar $^]
em algumas posições em algumas implementações.
Além disso, você precisa de uma barra invertida antes de /
se ela aparecer na expressão regular fora das expressões de colchetes. Você pode escolher um caractere alternativo como delimitador, por exemplo, s~/dir~/replacement~
ou \~/dir~p
; você precisará de uma barra invertida antes do delimitador, se quiser incluí-lo no BRE. Se você escolher um personagem que tenha um significado especial em um BRE e quiser incluí-lo literalmente, precisará de três barras invertidas; Eu não recomendo isso, pois pode se comportar de maneira diferente em algumas implementações.
Em poucas palavras, para sed 's/…/…/'
:
- Escreva o regex entre aspas simples.
- Use
'\''
para terminar com uma única citação na regex. - Coloque uma barra invertida antes de
$.*/[\]^
e apenas esses caracteres (mas não dentro de expressões de colchetes). - Dentro de uma expressão de colchete, para que
-
seja tratado literalmente, verifique se é a primeira ou a última vez ([abc-]
ou[-abc]
, não[a-bc]
). - Dentro de uma expressão de colchetes, para que
^
seja tratado literalmente, certifique-se de que não seja primeiro (use[abc^]
, não[^abc]
). - Para incluir
]
na lista de caracteres correspondidos por uma expressão de colchetes, escolha o primeiro caractere (ou primeiro depois de^
para um conjunto negado):[]abc]
ou[^]abc]
(não[abc]]
nem[abc\]]
).
No texto de substituição:
-
&
e\
precisam ser citados precedendo-os por uma barra invertida, assim como o delimitador (geralmente/
) e novas linhas. -
\
seguido por um dígito tem um significado especial.\
seguido por uma letra tem um significado especial (caracteres especiais) em algumas implementações, e\
seguido por algum outro caractere significa\c
ouc
dependendo da implementação. - Com aspas simples ao redor do argumento (
sed 's/…/…/'
), use'\''
para colocar uma única cotação no texto de substituição.
Se o texto de regex ou de substituição vier de uma variável de shell, lembre-se de que
- O regex é um BRE, não uma string literal.
- Na regex, uma nova linha precisa ser expressa como
\n
(que nunca será igual a menos que você tenha outro códigosed
adicionando caracteres de nova linha ao espaço padrão). Mas observe que isso não funcionará dentro de expressões de colchetes com algumassed
implementações. - No texto de substituição,
&
,\
e novas linhas precisam ser citados. - O delimitador precisa ser citado (mas não dentro de expressões de colchetes).
- Use aspas duplas para interpolação:
sed -e "s/$BRE/$REPL/"
.