2013-01-18 15 views
10

Bir komutun çıkışını sed olarak bir arama modeli olarak kullanmam gerekir. Ben yankı kullanarak örnek olsun, ama bu daha karmaşık bir komut olabilir üstlenecek: "Bazı desen" bir boşluk olduğu için çalışmıyor komutuArama modelindeki sed ile xargs nasıl kullanılır

echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt 

ama açıkça benim problem göstermek olduğunu düşünüyorum.

Bu komutu nasıl çalıştırabilirim? çift ​​tırnak bölünmüş olmaktan boşluk önlerken komut ikamesi çalışması için izin

sed -i "s/$(echo "some pattern")/replacement/g" file.txt 

: gibi önceden

sayesinde

cevap

6

kullanın komut ikamesi yerine, bu nedenle örnek görünürdü.

10

xargs'a -I anahtarı ile ne değiştirileceğini söylemeniz gerekir - en azından bazı sürümlerde otomatik olarak {} hakkında bilgi sahibi görünmüyor.

echo "pattern" | xargs -I '{}' sed -i 's/{}/replacement/g' file.txt 
+1

teşekkür ederiz! Benim günümü yaptın! :) – harrison4

0

sen (GNU sed) Bu işe yarayabilecek:

echo "some pattern" | sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt 

Esasen bir sed ikame komutu içine some pattern çevirip başka sed çağırma bir hat aracılığıyla beslenirler. Son çökelme işlemi, bir dosya aracılığıyla sed komutlarını kabul eden -f anahtarını kullanır; bu durumda dosya, - standart girdisidir. Eğer bash kullanıyorsanız

, here-string istihdam edilebilir:

<<<"some pattern" sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt 

N.B. | ve / numaralı sed separatörleri some pattern'un bir parçası olmamalıdır, aksi halde regexp düzgün şekilde oluşturulmaz.

1
bu Linux üzerinde çalışır

(test):

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'