retirer une clause de cas: l'expansion bash dans regexp sed: X = 'a \ .b'; Y = ';;' sed -n '/ $ {X} /, / $ {Y} / d'

StackOverflow https://stackoverflow.com/questions/3009202

Question

Je suis en train de supprimer une clause de cas à partir d'un script bash. La clause varie, mais toujours antislashs dans le cadre de la chaîne cas match.

Je tentais sed mais je ne pouvais utiliser awk ou perl en une ligne dans le script bash.

L'objectif de l'édition est simple, ressemble à:

 $cat t.sh
 case N in 
 a\.b); 
   #[..etc., varies] 
 ;;
 esac

Je suis aller à l'encontre de l'expansion variable de fuite, antislashs ou les deux points-virgules. Si j'eval 'je bande mon antislash échappe. Si je ne le fais pas, me les attraper des points-virgules vers le haut. J'ai donc essayé l'expansion dans le sous-shell sed. Ce commet une faute sur l'interprète comme je l'ai écrit. Plus d'échapper aux points-virgules ne semble pas aider.

X='a\.b' ; Y=';;'   
sed -i '/$(echo ${X} | sed -n 's/\\/\\\\/g')/,/$(echo ${Y} | sed -n s/\;/\\;/g')/d t.sh

Et ceci:

perl -i.bak -ne 'print unless /${X}/ .. /{$Y}/' t.sh  # which empties t.sh

et

eval perl -i.bak -ne \'print unless /${X}/ .. /{$Y}/' t.sh  # which does nothing
Était-ce utile?

La solution

Le printf Bash a une fonction citant qui va aider:

X='a\.b'; Y=';;'
sed "/$(printf "%q" "$X")/,/$(printf "%q" "$Y")/d" t.sh

ou vous pouvez en outre utiliser la fonction d'affectation variable printf:

printf -v X "%q" 'a\.b'
printf -v Y "%q" ';;'
sed "/$X/,/$Y/d" t.sh

Notez l'utilisation de guillemets doubles autour de l'argument de la commande sed. Les guillemets simples empêchent l'expansion des variables et la substitution de commandes. Lorsque ceux ne sont pas utilisés, cependant, il est généralement préférable d'utiliser des guillemets simples.

Autres conseils

X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh

joue à des jeux avec shell citer, mais cela fonctionne assez bien. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top