Estou tentando adicionar aspas ausentes no final de algumas linhas em um arquivo de texto.
Acho que o regex [^\"]$ é suficiente para encontrar linhas com aspas duplas de terminal ausentes e, portanto, tentei a seguinte substituição usando uma referência inversa (que tbh nunca usei antes). sed permitiria referência a esse grupo, mas
sed 's|([^\"]$)|\1\"|g' bigfile.tsv
exitos
sed: -e expression #1, char 17: invalid reference \1 on `s' command's RHS
e mesmo se eu não escapar das cotações de substituição
sed 's|([^\"]$)|\1"|g' bigfile.tsv
(embora agora seu char 16 é ofensivo) . Como fica a referência? https://xkcd.com/1171/
Quando você executa
sed
sem-E
, a expressão é uma expressão regular básica e os grupos de captura devem ser escritos como\(...\)
. Quando você usa-E
para habilitar expressões regulares estendidas, os grupos de captura são gravados(...)
.O
\
interior[...]
é literal, portanto, sua expressão também evitaria adicionar aspas duplas nas linhas que terminam com\
. Algumas das outras escapadas também são desnecessárias.Portanto, você pode escrever seu
sed
comando comoou como
Ou, usando
&
:A
&
parte de substituição da expressão será substituída pela parte da entrada que corresponde à expressão regular.Algumas outras alternativas que não usam um grupo de captura:
Isso se aplica
s/$/"/
a todas as linhas que correspondem a/[^"]$/
.Ou alternativamente,
Isso se aplica
s/$/"/
a todas as linhas que não correspondem/"$/
(há uma pequena diferença das outras abordagens aqui, pois também adiciona um"
a linhas vazias).Observe que em todos os casos, o
g
sinalizador no final definitivamente não é necessário.Tente
sed -e 's|\([^\"]$\)|\1\"|g' bigfile.tsv
.