2015-08-27 15 views
7

Variabile XFILEBASE64 ha contenuto codificato in base 64 e voglio sostituire una stringa con quel contenuto di base64.Come passare il contenuto dell'ecode di base64 su sed?

Sicuramente abbastanza base64 è pieno di caratteri speciali, e ho provato $ '\ 001' come delimitatore, ricevendo comunque il messaggio di errore. Eventuali suggerimenti?

XFILEBASE64=`cat ./sample.xml | base64` 
cat ./template.xml | sed "s$'\001'<Doc>###%DOCDATA%###<\/Doc>$'\001'<Doc>${XFILEBASE64}<\/Doc>$'\001'g" 
> sed: -e expression #1, char 256: unterminated `s' command 

EDIT: Sembra che problema non ha nulla a che fare con sed, deve essere nascosta nelle operazioni di base64.

sample.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<a>testsdfasdfasdfasfasdfdasfdads</a>  

Per riprodurre il problema:

foo=`base64 ./sample.xml` 
echo $foo | base64 --decode 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<base64: invalid input 
+0

quale sistema operativo e infine LANG? Unix sta trattando in modo diverso a seconda del valore di OS e LANG e sed è puramente testo (ASCII se ricordo bene), quindi questi caratteri tendono ad essere interpretati come EOL. Inoltre, non tutte le sed consentono la codifica hexa (octal sembra più disponibile) – NeronLeVelu

+0

OS è RHEL 7.1 e LANG en_US.UTF-8, non penso che Hex sia un problema se lascio delimitatore hexa e sostituisco il contenuto variabile con una stringa statica, va bene. – user52028778

+0

right, replying capisco più chiaramente che questo non è un problema di char speciale all'interno di file di variabili o di template, e tu includi semplicemente l'esagono come separatore – NeronLeVelu

risposta

2

Il problema era nella codifica in base64, l'opzione -w 0 di base64 ha funzionato.

cat ./sample.xml | base64 -w 0 
2

Base64 ha solo tre caratteri speciali (wikipedia) - di solito +, / e =. È possibile utilizzare ad esempio @, , & o ; senza problemi.

+0

provato con @ ottenendo lo stesso problema, presumo che il problema sia da qualche parte in base64 – user52028778

2
Tempo64="$(echo "${XFILEBASE64}" | sed 's/[\\&*./+!]/\\&/g')" 
sed "s!<Doc>###%DOCDATA%###</Doc>!<Doc>${Tempo64}</Doc>!g" ./template.xml 
  • dovrebbe funzionare e conforme a POSIX
+0

Secondo sed si lamenta ancora del fatto che il ' – user52028778

+0

'non terminato è certamente un carattere senza caratteri in Tempo64 da aggiungere alla prima classe. Ho dimenticato '!' Almeno (corretto ora). – NeronLeVelu

+0

ancora lo stesso messaggio di errore – user52028778

1

Il comando

sed "s$'\001'<Doc>###%DOCDATA%###<\/Doc>$'\001'<Doc>${XFILEBASE64}<\/Doc>$'\001'g" 

dovrebbe essere scritto come

sed s$'\001'"<Doc>###%DOCDATA%###<\/Doc>"$'\001'"<Doc>${XFILEBASE64}<\/Doc>"$'\001'g 

Vale a dire, $'...' in doppia q gli uote non sono speciali

Problemi correlati