regex para adicionar aspas faltantes

3

Eu estou tentando adicionar aspas faltando no final de algumas linhas em um arquivo de texto.

Eu acho que o regex [^ \ "] $ é suficiente para encontrar linhas com terminais em falta e então tentei a seguinte substituição usando uma backreference (que nunca usei antes). Usando parênteses em torno do 'grupo de captura' Eu esperava que sed permitisse uma referência retroativa a esse grupo, mas

sed  's|([^\"]$)|\"|g' bigfile.tsv

acessos

sed: -e expression #1, char 17: invalid reference  on 's' command's RHS

e mesmo se eu não escapar das citações de substituição

sed  's|([^\"]$)|"|g' bigfile.tsv

(tho agora seu char 16 é ofensivo). Como a referência de referência vai? link

    
por jeremy_rutman 12.11.2018 / 15:41

2 respostas

6

Quando você executa sed sem -E , a expressão é uma expressão regular básica e os grupos de captura devem ser gravados como \(...\) . Quando você usa -E para ativar expressões regulares estendidas, os grupos de captura são gravados (...) .

O \ dentro de [...] é literal, portanto, sua expressão também evitaria a inclusão de aspas duplas nas linhas que terminam em \ . Algumas das outras fugas também são desnecessárias.

Portanto, você pode escrever seu comando sed como

sed 's/\([^"]\)$/"/'

ou como

sed -E 's/([^"])$/"/'

Ou usando & :

sed 's/[^"]$/&"/'

O & na parte de substituição da expressão será substituído pela parte da entrada que correspondeu à expressão regular.

Algumas outras alternativas que não usam um grupo de captura:

sed '/[^"]$/ s/$/"/'

Isso aplica s/$/"/ a todas as linhas que correspondem a /[^"]$/ .

Ou, alternativamente,

sed '/"$/ !s/$/"/'

Isso aplica s/$/"/ a todas as linhas que não correspondem a /"$/ (há uma pequena diferença em relação às outras abordagens aqui, pois também adiciona " às linhas vazias).

Observe que, em todos os casos, o sinal g no final é definitivamente desnecessário.

    
por 12.11.2018 / 15:56
2

Experimente sed -e 's|\([^\"]$\)|\"|g' bigfile.tsv .

    
por 12.11.2018 / 15:51