Vraag Hoe gebruik ik variabelen in een sed-opdracht?


Ik heb de volgende code geprobeerd te vervangen QQ met ZZ, maar het doet niet wat ik wil:

var1=QQ
sed -i 's/$var1/ZZ/g' $file

Deze code doet echter wat ik wil:

sed -i 's/QQ/ZZ/g' $file

Hoe gebruik ik variabelen in sed?


178
2017-11-07 16:30


oorsprong


zien mijn antwoord in deze post van jou - ata
verwant: stackoverflow.com/questions/407523/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


antwoorden:


De shell is verantwoordelijk voor het uitbreiden van variabelen. Wanneer u enkele aanhalingstekens gebruikt voor tekenreeksen, wordt de inhoud ervan letterlijk behandeld sed probeert nu elk voorkomen van het letterlijke te vervangen $var1 door ZZ.

Dubbele aanhalingstekens gebruiken

Gebruik dubbele aanhalingstekens om de shell variabelen uit te breiden met behoud van witruimte:

sed -i "s/$var1/ZZ/g" "$file"

Wanneer u het aanhalingsteken in de vervangende tekenreeks nodig hebt, moet u daaraan voorafgaan met een backslash die door de shell wordt geïnterpreteerd. In het volgende voorbeeld de tekenreeks quote me zal worden vervangen door "quote me" (het personage & wordt geïnterpreteerd door sed):

sed -i "s/quote me/\"&\"/" "$file"

Enkelvoudige aanhalingstekens gebruiken

Als u veel shell-metakarakters hebt, overweeg dan om enkele aanhalingstekens voor het patroon te gebruiken en dubbele aanhalingstekens voor de variabele:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Let op hoe ik gebruik s,pattern,replacement, in plaats van s/pattern/replacement/, Ik deed het om interferentie met de te vermijden / in \0/.

Voorbeeld

De shell voert dan de bovenstaande opdracht uit sed met de volgende argumenten (ervan uitgaande pattern=bert en file=text.txt):

-i
s,bert,Say hurrah to &: \0/,
text.txt

Als file.txt bevat bert, de uitvoer zal zijn:

Say hurrah to bert: \0/

252
2017-11-07 17:20



Hoe zou men de "/ g" -optie doorgeven met behulp van dit door komma's gescheiden formulier? - blong
@ b.long Het is a g optie, dus je zou slagen s,foo,bar,g in plaats daarvan. - Lekensteyn
je enkel aanhalingsteken voorbeeld is bijzonder nuttig, heeft betrekking op sed met behulp van regex patroon behoorlijk mooi! - Brian Thomas
In het geval u in de verleiding komt om te gebruiken \\0 in plaats van \0, het moet niet gebeuren wanneer \0 staat tussen enkele aanhalingstekens. Anders sed zal het patroon substitueren voor een letterlijke \0 in plaats van de hele wedstrijd. - Lekensteyn


We kunnen variabelen gebruiken in sed dubbele aanhalingstekens gebruiken:

sed -i "s/$var/r_str/g" file_name

Als je een schuine streep hebt / gebruik in de variabele een ander scheidingsteken, zoals hieronder:

sed -i "s|$var|r_str|g" file_name

78
2017-08-07 15:29