Sed kullanarak bir dosyanın içeriğiyle dizgiyi değiştirin


23

İki farklı dosyam var:

file1

/home/user1/  
/home/user2/bin  
/home/user1/a/b/c

file2

<TEXT1>
<TEXT2>

Ben değiştirmek istiyorum <TEXT1>ait File2 içeriğiyle File1 kullanarak sed. Bu komutu denedim ama uygun çıktı alamadım:

cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"

Bu sorunu çözmek için başka araçlar da kullanabilirsiniz.


Lütfen bu hata iletisini yapıştırın, böylece kaynağını bulabiliriz. Ayrıca hangi seduygulamayı kullandığınızı da bize bildirin . Sen benim için GNU ile kod yazıyorsun sed.
Manatwork

Üzgünüz, hata alamadım. İstenilen çıktıyı alamıyorum. Çıktı gibidir /home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>. Yeni çizgiler alamıyor.
chanchal1987

Bunun sizin durumunuzda geçerli olup olmadığından emin değilsiniz, ancak diffve patcharaçları ile bir dosyadaki bazı satırların diğer satırlarla kolayca değiştirilmesine izin verilir.
Stéphane Gimenez

1
BTW, $()sed betiğinde toplanan rastgele verileri kullanmak gözlerimin kanamasına neden oluyor. Bazı karakterlerin özel anlamlarla yorumlandığı yerlerde asla harici veri kullanmayın.
Stéphane Gimenez

Yanıtlar:


24

İşte sed komut dosyası çözümü (gözlerde komut satırında bir satır içine almaya çalışmaktan daha kolay):

/<TEXT1>/ {
  r File1
  d
}

Çalıştırılıyor:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>

Teşekkürler bu çalışıyor. Ancak başka bir komut dosyası kullanmak istemiyorum. Herhangi bir satır içi çözüm var mı?
chanchal1987

Tabii:, sed '/<TEXT1>/{rFile1^Md^M}' File2burada "^ M", return tuşuna basıyorsunuzdur. Sorun şu ki sed, r ve d komutunu sınırlamak için {...} içindeki yeni satırlara ihtiyaç duyuyor.
Kusalananda

6
bash ile posix tarzı karakter dizileri biraz daha temiz:sed $'/<TEXT1>/ {r File1\n d}'
glenn jackman

9
Ayrıca -e ile bir astar için:sed -e '/<TEXT1>/{r File1' -e 'd}' File2
sdaau

1
Ve ya içindeki tüm çizgiyi değiştirmek yerine, <TEXT1>sadece çizginin geri kalanını bozulmadan bırakarak sadece dizgenin yerini değiştirmek istersem? Text1: <TEXT1>için Text1: <file_contents>.
Robin Winslow

9

Var değişimi kullanarak bu çözümü bulmak uzun zaman aldı. Tüm sed çözümler benim için işe yaramadı, çünkü ya tam satırları sildiler ya da yanlış.

FILE2=$(<file2)
FILE1=$(<file1)
echo "${FILE2//TEXT1/$FILE1}" 

Dosya2'deki TEXT1'in tüm oluşumlarını dosya1'in içeriğiyle değiştirir. Diğer tüm metinlere dokunulmaz.


çok hoş. Muhtemelen sedçok daha hızlı , çünkü bu "genişlemeler" (aka değiştirmeler) kabuğun içine yerleştirilmiş ( bashen azından)
sarı-sarı

7

Cevap veriyorum çünkü diff/ patchyöntemi bazı durumlarda ilgi çekici olabilir. Dosyasındaki satırların bir ikame tanımlamak için blob1içerdiği çizgilerle blob2kullanımı:

diff -u blob1 blob2 > patch-file

Örneğin, eğer blob1içeriyorsa:

hello
you

ve blob2içerir:

be
welcome
here

oluşturulan patch-fileolacak:

--- blob1   2011-09-08 16:42:24.000000000 +0200
+++ blob2   2011-09-08 16:50:48.000000000 +0200
@@ -1,2 +1,3 @@
-hello
-you
+be
+welcome
+here

Şimdi bu yamayı başka bir dosyaya uygulayabilirsiniz:

patch somefile patch-file

Bu yerini alacak hello, youtarafından çizgiler be, welcome, hereçizgiler içinde somefile.


bu gerçekten
zekicedir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.