Sed kullanarak listeyi okuyarak metin dizeleri nasıl değiştirilir


1

Ben kabuğundan çalıştırmak için sed bir script ile gelip çalışıyorum. İki sütun içeren harici bir dosyadan UUID'lerin bir listesini okuyabilmem gerekiyor

origtexta replacementa
origtextb replacementb
origtextc replacementc

Komutun geçerli klasörün altındaki tüm txt dosyalarında özyinelemeli olarak çalışması gerekir, herhangi bir 'origtext örneği' arayın. ve 2 sütunundaki karşılık gelen metinle değiştirin. Komutun / home / myuser / Scripts / ve / aliased içinde saklayabilmesi harika bir şey olurdu ve çağırdığım herhangi bir yerden çalıştırılabilmesi için harika olurdu ve eğer komut orijinal txt dosyasını değiştirmeden önce .txt.orig olarak kaydetti.

Şimdiye kadar bu bit test ettik:

#!/bin/sed
while read n k; do sed -i 's/$n/$k/g' *.txt; done < list

Bu konuda buldum hangi: dize listesini başka bir listeyle değiştirme

Bir şey yapıyor gibi görünüyor, çünkü dosyaların tarihleri ​​geçerli tarih / saate değişir, ancak hiçbir metin aslında değiştirilmez, bu yüzden bu çalışmayı nasıl elde edeceğime emin değilim.

Yanıtlar:


2

Bunun için bash yapışırdım. sed betiğini dinamik olarak derlemek

while read uuid uuid_alias; do 
    sed_script+="s/$uuid/$uuid_alias/g;"
done < list

find . -type f -name \*.txt -exec sed -i "$sed_script" '{}' +

Zaman verimliliği için sed'i mümkün olduğunca az sayıda çağırmaya çalışmalısınız.

Ayrıca değişkenler vardır $ unutmayınız değil "çift tırnak" değişken genişleme izin - 'tek tırnak' içine genişletti.


Bu konuda yeni olduğum için benimle ayı. Bunu uuidrepl.sh isimli bir dosyaya bırakıp çalıştırmaya çalıştığımda, şunu alıyorum: bash: ./uuidrepl.sh: / bin / bash ^ M hatalı yorumlayıcı: Böyle bir dosya ya da dizin yok
graphics.guy

Metin düzenleyiciniz DOS tarzı satır sonları kullanıyor (satır başı artı yeni satır). İşletim sisteminiz sadece yeni satırları tanır ve satır başı eski karakterleri gibi satır başı işlemlerini gerçekleştirir, bu nedenle OS "/ bin / bash <CR>" tercüman adlarını arar ve böyle bir dosya yoktur. Komut dosyalarınızı Windows'ta düzenlerseniz, dosyaları "Unix stili" satır sonlarıyla kaydedebilecek bir metin düzenleyici kullanın. Alternatif olarak, komut dosyalarınızı linux'a aktarırken dos2unix, satırbaşını çıkarmak için programı kullanın.
glenn jackman

Hmm, durumun bu olduğundan emin değilim. Sadece betiği nano olarak manuel olarak yeniden yazdım ve bu aynı hatayı veriyor. Sırf aynı sayfadayız, artık rastgele metin içeren iki metin dosyası içeren bir klasör artı değiştirilecek bazı örnek dizeler (test1.txt ve test2.txt), değiştirme çiftlerini içeren bir 'liste' dosyası ve #! / bin / bash başlığını ve kod bloğunuzun tüm içeriğini yukarıdan içeren uuidrepl.sh betiği.
graphics.guy

Bu sabah ona bir kez daha baktım ve ilk denememde itilen fazladan bir satır sonu olabileceğini düşünüyorum. Senaryoyu bazı test dosyalarında çalıştırmayı başardım, o yüzden haklıydın. Bunun için teşekkürler! Şimdi değiştirme dizisini çalıştırmadan önce orijinalin .txt.orig olarak yedeklenmesini sağlamaya çalışıyorum.
graphics.guy

En basit yol:sed -i.orig ...
Glenn jackman
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.