sql >> Database >  >> NoSQL >> Redis

Het gebruik van sed op xargs-variabele werkt niet binnen shell-expansie

Oplossing met alleen sed

sed is zelf in staat om zowel de ongewijzigde als de gewijzigde regel te produceren:

$ echo "redis::staging::key" | sed 's/^/RENAME /; p; s/staging/development/g'
RENAME redis::staging::key
RENAME redis::development::key

In het bovenstaande voegt sed eerst de RENAME-tekenreeks toe aan het begin van de regel. Dan, de p commando vertelt sed om de regel af te drukken zoals die er op dat moment uitziet (met "staging" er nog steeds in). De volgende vervanging zet "ontwikkeling" in en dan wordt die versie ook afgedrukt.

Bijwerken: Stel dat we de uitvoer op één regel willen hebben:

$ echo "redis::staging::key" | sed 's/.*/RENAME & &/; s/staging/development/2'
RENAME redis::staging::key redis::development::key

De eerste s commando hierboven voegt RENAME toe aan het begin en verdubbelt vervolgens de regel. De tweede vervangt het tweede optreden van enscenering door ontwikkeling.

Waarom heeft de xargs-versie de vervanging niet gedaan?

xargs -I {} echo "RENAME {} $(echo {} | sed 's/staging/development/g')"

Voordat xargs wordt uitgevoerd, verwerkt bash de strings. In het bijzonder ziet het $(echo {} | sed 's/staging/development/g') en het voert het uit ("opdrachtvervanging") en krijgt het resultaat {} . Dus wanneer xargs uiteindelijk wordt uitgevoerd, ziet het de opdracht:

xargs -I {} echo "RENAME {} {}"

Bijgevolg is de s/staging/development/g vervanging wordt nooit gemaakt.

Xargs en shell in de juiste volgorde laten samenwerken

Hier is een oplossing voor:

$ echo "redis::staging::key" | xargs -I {} sh -c 'echo RENAME {} $(echo {} | sed 's/staging/development/g')'
RENAME redis::staging::key redis::development::key

Het bovenstaande plaatst de bash-commando's tussen enkele aanhalingstekens en geeft ze als argumenten door aan sh . Op deze manier wordt de string pas door de shell verwerkt nadat xargs de vervangingen heeft gemaakt.




  1. Stop Mongoose met het maken van _id eigenschap voor subdocumentarray-items

  2. 3 manieren om een ​​string om te zetten naar een datum in MongoDB

  3. Groepsarray na ontspannen en match

  4. Moongoose totale $ match komt niet overeen met id's