sed funciona quando a entrada do eco, mas não do arquivo

1

O texto a seguir remove as aspas próximas da string do endereço de e-mail:

$ echo  "[email protected]" | sed 's/"([^"]*)"/
$ cat ~/Desktop/emails.txt 
"[email protected]"  
$ sed 's/"([^"]*)"/
$ echo  "[email protected]" | sed 's/"([^"]*)"/
$ cat ~/Desktop/emails.txt 
"[email protected]"  
$ sed 's/"([^"]*)"/%pre%/g' ~/Desktop/emails.txt    
"[email protected]"   
$ sed -i '' 's/"([^"]*)"/%pre%/g' ~/Desktop/emails.txt
$ cat ~/Desktop/emails.txt 
"[email protected]"  
/g' [email protected]
/g' ~/Desktop/emails.txt "[email protected]" $ sed -i '' 's/"([^"]*)"/%pre%/g' ~/Desktop/emails.txt $ cat ~/Desktop/emails.txt "[email protected]"
/g' [email protected]

Mas se:

%pre%

Tentando aplicar exatamente a mesma substituição de regex de sed usando um arquivo que contém a mesma seqüência de caracteres não funciona.
O que estou fazendo errado?

    
por Jim 17.01.2017 / 23:33

3 respostas

9

Desculpe, mas seu exemplo echo não funciona. Parece funcionar porque as aspas duplas ( " ) são interpretadas por bash e nunca são passadas para sed .

Observe a diferença entre os dois exemplos a seguir:

$ echo "[email protected]" 
[email protected]
$ echo "\"[email protected]\"" 
"[email protected]"

Seu comando echo não alimenta o " para sed , então parece funcionar porque não há " para remover na sequência de entrada.

Se você tentar escapar corretamente do " , o exemplo echo não funcionará como file exemplo:

$ echo  "\"[email protected]\"" | sed 's/"([^"]*)"/
echo  "\"[email protected]\"" | sed 's/"\([^"]*\)"//g' 
/g' "[email protected]"

O comando sed tem dois erros:

  1. Você está usando a sintaxe de regex estendida. Você pode usá-lo somente se tiver gnu sed. A diferença está na maneira como eles usam os parênteses.
  2. Você deve contar as referências anteriores começando por 1 .

Portanto, o comando correto é:

echo "\"[email protected]\"" | sed -E 's/"([^"]*)"//g'

ou, se o seu sed suportar regex estendido:

$ echo "[email protected]" 
[email protected]
$ echo "\"[email protected]\"" 
"[email protected]"
    
por 17.01.2017 / 23:56
3
gv@debian:$ cat a.txt
"[email protected]"

gv@debian:$ sed 's#"##g' a.txt #remove all quotes
[email protected]

gv@debian:$ cat a.txt |tr -d '"' #remove all quotes
[email protected]

gv@debian:$ sed 's#^"##g; s#"$##g' a.txt #remove first and last quote 
[email protected]

gv@debian:$ a="\"[email protected]\"";echo -e "$a" "\n" "${a: 1:-1}" #remove first and last char
"[email protected]" 
 [email protected]
    
por 17.01.2017 / 23:47
1

Como mencionado por @andcoz, este

$ sed -i '' 's/"([^"]*)"/
$ sed -i '' 's/"\([^"]*\)"//g' ~/Desktop/emails.txt  
/g' ~/Desktop/emails.txt

precisa do parentheses com escape e do backreference alterado de para sed .

Após a modificação, um comando funcional %code% se parece com isto:

$ sed -i '' 's/"([^"]*)"/
$ sed -i '' 's/"\([^"]*\)"//g' ~/Desktop/emails.txt  
/g' ~/Desktop/emails.txt
    
por 18.01.2017 / 00:03