Existem dois níveis de interpretação aqui: a concha e sed.
No shell, tudo entre aspas simples é interpretado literalmente, exceto as próprias aspas. Você pode efetivamente ter uma única citação entre aspas simples, escrevendo '\''
(aspas simples fechadas, uma aspas simples literal, aspas simples abertas).
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 dos conjuntos de caracteres ( […]
). Letras, dígitos e (){}+?|
não devem ser citados (você pode citar alguns deles em algumas implementações). As sequências \(
, \)
, \n
, e em algumas implementações \{
, \}
, \+
, \?
, \|
e outra barra invertida + alfanuméricos têm significados especiais. Você pode evitar não citar $^
em algumas posições em algumas implementações.
Além disso, você precisa de uma barra invertida antes /
para aparecer na regex fora das expressões entre colchetes. Você pode escolher um caractere alternativo como delimitador escrevendo, por exemplo, s~/dir~/replacement~
ou \~/dir~p
; você precisará de uma barra invertida antes do delimitador, se desejar incluí-lo no BRE. Se você escolher um personagem que tenha um significado especial em um BRE e desejar 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 a regex entre aspas simples.
- Use
'\''
para terminar com uma citação única na regex.
- Coloque uma barra invertida antes
$.*/[\]^
e somente esses caracteres (mas não dentro das expressões entre colchetes). (Tecnicamente, você não deve colocar uma barra invertida antes, ]
mas eu não conheço uma implementação que trate ]
e \]
diferentemente das expressões entre colchetes.)
- Dentro de uma expressão entre colchetes, para
-
ser tratada literalmente, verifique se é a primeira ou a última ( [abc-]
ou [-abc]
não [a-bc]
).
- Dentro de uma expressão agrupada, para
^
ser tratado literalmente, ter certeza que é não primeiro (uso [abc^]
, não [^abc]
).
- Para incluir
]
na lista de caracteres correspondidos por uma expressão entre colchetes, torne-o o primeiro caractere (ou o primeiro depois ^
de 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 as 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 meio de caractere \c
ou c
dependendo da implementação.
- Com aspas simples ao redor do argumento (
sed 's/…/…/'
), use '\''
para colocar uma aspas simples no texto de substituição.
Se o regex ou o texto de substituição vier de uma variável do shell, lembre-se de que
- O regex é um BRE, não uma sequência literal.
- Na regex, uma nova linha precisa ser expressa como
\n
(que nunca corresponderá, a menos que você tenha outro sed
código adicionando caracteres de nova linha ao espaço do padrão). Mas observe que ele não funcionará dentro das expressões de colchete em algumas sed
implementações.
- No texto de substituição,
&
, \
e novas linhas precisam ser citado.
- O delimitador precisa ser citado (mas não dentro das expressões entre colchetes).
- Use aspas duplas para interpolação:
sed -e "s/$BRE/$REPL/"
.
function sedPath { path=$((echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\[]]/g')>&1) } #Escape path for use with sed