SED: erro de sintaxe na linha 19 do script.pl, próximo a “; $ '”

0

Eu estou usando este comando para excluir várias ocorrências de uma linha no meu script e ele só funciona bem quando eu executá-lo no prompt de comando. No entanto, quando eu uso essa linha no meu script perl, ele gera um erro SED: syntax error no script.pl linha 19, próximo a "; $ '". Abaixo está a linha no meu script. Eu tentei escapar, mas essa ajuda

sed '/<\/data_item>/{N;/<\/data_item>$/{N;$'!'{s/\n//;D}}}' $WX;

user3614491
fonte
sed não faz parte do Perl. Mas eu vou te dar o benefício da dúvida e assumir que você declarou sua própria sub-rotina chamada sed em outro lugar no seu script. Que prompt de comando você está dizendo que isso funcionou? Eu apenas tentei no bash e dá um erro. Devo dizer que estou confuso com o ponto de exclamação ! meio caminho. Talvez você possa fornecer a versão "prompt de comando" original e explicar o que está tentando fazer.
Lqueryvg
Desculpe eu estou usando backticks aqui. Eu tenho outros comandos sed mais simples no meu script perl e eles simplesmente funcionam bem .. No script acima perl aponta para algo em torno desta parte $ / {N; $ '!' {S / \ n //; D}}} ' e lança um erro
user3614491
Vamos ver um desses "comandos sed" de outra parte do seu script Perl que funciona bem.
Lqueryvg

Respostas:

0

OK, dando-lhe o benefício da dúvida (que você definiu sua própria sub-rotina chamada sed ), sua instrução "Perl" é dividida da seguinte maneira:

sed                                           # A call to a subroutine called "sed"
                                              # that you've defined ?

'/<\/data_item>/{N;/<\/data_item>$/{N;$'   # A string surrounded by single quotes

!                        # an exclamation mark

'{s/\n//;D}}}'           # another string surrounded by single quotes

$WX;                     # a scalar variable called "WX"

O erro de sintaxe real que você está recebendo é por causa do ponto de exclamação. Em Perl, você não pode simplesmente colocar caracteres fora de strings e fazer com que eles se concatenem com as strings circunvizinhas, como acontece com shell.

Mesmo no shell, não tenho certeza se a linha como você citou funcionaria. Então eu acho que você realmente precisa expandir sua pergunta original para progredir isso.

Lqueryvg
fonte
Na verdade, no shell, ele funciona apenas com aspas simples em torno de $ '!' caso contrário, lançará outro erro. Outros exemplos no script perl são sed -i '2,\${/xml version/d;}' $WX ; sed -i '3,\${/top/{N;d;}}' $WX ; sed -i '3s/=.*\$/="check">/' $WX; e todos eles simplesmente funcionam bem ..
user3614491
OK, faz mais sentido agora eu posso ver os backticks. Parece que você vai precisar escapar de alguns personagens aqui ou ali. Por favor, forneça o comando exato que funcionou na linha de comando. Eu ainda estou confuso com esse ponto de exclamação.
Lqueryvg