espaço extra na saída sed que afeta outro script

0

Precisa remover espaço extra no comando sed

Consegui obter uma string após $$ ENV $$ _ no arquivo com o comando abaixo

sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' file.txt

estou executando o comando como:

TAB=$(sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' $file.txt)

e esta variável ($ TAB) eu estou passando um comando diferente para substituir o valor no arquivo diferente com o comando:

cat backup.txt | sed 's%\$\$BTABLE\$\$%"${TAB}"''%g' > $file_bkp1.txt

mas na minha saída, estou ganhando um espaço extra.

arquivo.txt

CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE , NO FALLBACK , 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    CHECKSUM = DEFAULT, 
    DEFAULT MERGEBLOCKADSRATIO

Comando sed para buscar valor no arquivo.txt

TAB=$(sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' file.txt)

Comando para substituir o valor (de: $$ BTABLE $$) para (TEMP_ESM.EMPASGMTAMPTMPRTRSE) de backup.txt

cat backup.txt | sed 's%\$\$BTABLE\$\$%"${TAB}"''%g' > file_bkp.txt

backup.txt Arquivo de entrada

CREATE MULTISET TABLE $$ENV$$_$$BTABLE$$_NEW ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      AR_ID INTEGER NOT NULL,
      AR_TO_RTE_TY_RL_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_BASIS_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_ID INTEGER NOT NULL,

Saída do arquivo_bkp.txt com espaço extra no final destacado em negrito Arquivo de saída :

CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE _NEW ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      AR_ID INTEGER NOT NULL,
      AR_TO_RTE_TY_RL_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_BASIS_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_TY_ID VARCHAR(32) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      RTE_ID INTEGER NOT NULL,
    
por Baranidharan 05.12.2017 / 11:23

2 respostas

0

Pegue a tag com

TAB=$(sed -n 's%.*\$\$ENV\$\$_\(.*\)_NEW.*%%p' file.txt)

Isso usa -n para pular a impressão de todas as linhas, exceto aquelas explicitamente designadas para impressão. O sinalizador p na substituição diz "imprima esta linha se uma substituição ocorreu".

Além disso, para a linha em que estamos interessados, filtramos tudo, exceto a subseqüência exata em que estamos interessados, cercando a substring com \(..\) . Então, na substituição, podemos puxar o texto dentro desses parênteses com uma "referência de volta": .

Com este valor, faça a substituição com:

sed 's%\$\$BTABLE\$\$%'"${TAB}"'%g'

Esta é apenas uma ligeira variação do seu comando com alguns ajustes na cotação.

    
por 05.12.2017 / 13:07
0

Bem, com a entrada aqui:

CREATE MULTISET TABLE $$ENV$$_TEMP_ESM.EMPASGMTAMPTMPRTRSE , NO FALLBACK ,

O script sed sed '/.*$$ENV$$_/!d;s///;s/,.*//;s/^[ \t]*//' seria o primeiro remova esse $$ENV$$_ ( /.*$$ENV$$_/!d; s/// ), remova qualquer coisa após a vírgula ( s/,.*// ) e remova todos os espaços à esquerda ( s/^[ \t]*// ), mas não o espaço antes da vírgula. Portanto, a saída é TEMP_ESM.EMPASGMTAMPTMPRTRSE␣ , com um espaço à direita ( ). Eu acho que o espaço continua na sua saída.

Acho que você poderia alterar essa última substituição para s/[ \t]*//g (remover a ^ anchor, adicionar /g ) para remover todo e qualquer espaço em branco restante da string.

    
por 05.12.2017 / 14:32

Tags