2016-09-06 2 views
1

J'ai un fichier journal binaire avec des lignes similaires qui sont séparées par le caractère "^ A" non imprimable.commande linux pour déplacer une partie d'une chaîne avec un caractère non imprimable

Je vois ce symbole blanc rétro-éclairé quand j'ouvrir le fichier avec la commande « moins »

blah9234^Azzz123^A1=123 
blah6344^Azzz123^A1=456 
blah4555^Azzz123^A1=78912 

Je dois le convertir en:

zzz123^A1=123^Ablah9234 
zzz123^A1=456^Ablah6344 
zzz123^A1=78912^Ablah4555 

donc je besoin de prendre la première partie

blah9234 

Ajouter un symbole non imprimable^A

^Ablah9234 

et le mettre dans la ligne et

zzz123^A1=123^Ablah9234 

pour commencer que j'ai essayé d'ajouter^A au début de la ligne:

sed 's/^.*blah/^Ablah/' my.log > new.log 

mais il ajoute que «^'et' A 'et j'ai:

^Ablah9234^Azzz123^A1=123 

et d'abord^A ne rétro-éclairé blanc dans moins de visionneuse.

Un conseil serait utile. Merci.

+0

Ceci devrait fonctionner 'sed 's/^ \ (blah [^' $ '\ 001' '] \ + \)' $ '\ 001' '\ (. * \) $/\ 2' $ '\ 001 '' \ 1/'my.log> new.log' – alvits

+0

Si vous n'aimez pas l'occurence multiple de '$' \ 001'' vous pouvez utiliser' sed $ 's/^ \\ (blah [^ \ 001 ] \\ + \\) \ 001 \\ (. * \\) $/\\ 2 \ 001 \\ 1/'my.log> nouveau.log'. – alvits

+0

Ou si votre 'sed' supporte l'expression étendue, essayez' sed -r $ 's/^ (blah [^ \ 001] +) \ 001 (. *) $/\\ 2 \ 001 \\ 1 /' mon. log> nouveau.log'. – alvits

Répondre

1

Vous pouvez le faire:

sed 's/^.*blah'$'\001''blah/' my.log > new.log 

Ou:

#get the value of the ^A control character 
ctrlACode=$'\001' 

#use it when we call sed 
sed 's/^.*blah'"$ctrlACode"'blah/' my.log > new.log 

Pour comprendre le deuxième exemple, vous devez comprendre this. Fondamentalement, $'\0xx' est égal au caractère de contrôle qui a cette valeur en octal. Par exemple, $'\000' est le caractère de contrôle NUL. $'\001' est ^A, le caractère de contrôle SOH, etc.


Une encore plus facile se trouve here.

De cette façon, vous tapez ctrl-v puis ctrl-a pour insérer ^A.