Yinelemeli sed aramasını test et ve çalıştırmadan önce değiştir


13

sedGerçekte çalıştırmadan önce bir deneme yinelemeli arama yapmanın ve kullanarak değiştirmenin herhangi bir yolu var mı ? Sadece arama ve değiştirme yapmadan önce sonuçları yazdırmak istiyorum. Sonuçlarının yankılanması gibi bir şey,

grep -rl term1 . |xargs sed -i -e 's/term1/term2/'

Verilerin bir kopyasını oluşturun, komutunuzu çalıştırın, sonucu inceleyin.
Kusalananda

Yanıtlar:


10

Sen sedolmadan çalışabilir -ive çıktı ile adım adımless

grep -rl --null term1 . | xargs -0 sed -e 's/term1/term2/' | less

Ardından , daha sonra fark edebileceğiniz yedeklemeler oluşturmak için sedbirlikte -i.bakçalışın

grep -rl --null term1 . | xargs -0 sed -i.bak -e 's/term1/term2/'
diff somefile.bak somefile
# verify changes were correct

Düzenleme: Yorumda önerildiği gibi kullanın grep --null | xargs -0. Bu, dosya adlarının boş bayt tarafından sonlandırılmasına neden olur ve bu da yeni satır gibi sıra dışı karakterlere sahip dosya adlarının güvenli olmasını sağlar. Evet, \nunix dosya adında geçerli bir karakterdir. Tek yasak karakter eğik çizgi /ve boş karakterdir\0


İlginç, -i'nin anlamını bulmaya çalıştım ama adam sed altında listelenmedi. Çözümünüz işe yaradı. Dosyayı değil, yalnızca satırları listelemenin en iyi yolu ne olabilir? Ben daha az boru yerine boru | grep term2, hangi tür çalıştı ama ben de garip karakterler ile bazı çıktı var.
user251482

@ user251482 - "Eski ve yeni dosya arasındaki farkın görüntülenmesi" nde olduğu gibi "sadece satırları listelemek"?
grebneke

1
@StephaneChazelas Evet, hatta grep -rl --nullOP işletim sistemini belirtmediğinden ve -ZBSD / OSX'te (açma) farklı bir şey ifade ettiğinden daha da iyidir . --nullhem GNU hem de BSD için aynıdır
grebneke

1
@grebneke. İyi bir nokta, ancak OP'nin GNU sed sözdizimini kullandığını unutmayın, bu yüzden BSD'lerde olmadığını varsayabiliriz. Bu grepFreeBSD ve NetBSD üzerinde GNU grep (çatal) olduğunu unutmayın . NetBSD günü, -Zyine araçlarının --null(man sayfasına göre), ama --null daha taşınabilir katılıyorum. Ayrıca OpenBSD'de ne --null ne de -Z'nin işe yaramadığını unutmayın
Stéphane Chazelas

1
@grebneke, bu kadar sed -i '' -e s/.../BSD'de sed(hiçbir opsiyonel seçenekler)
Stéphane Chazelas

5

Yerine sedile findkullanıngrep

Her şeyden önce, finddaha ziyade işe alırdım grepve bu üç iyi nedenden dolayı:

  1. finddaha hassas dosya seçimine izin verir. Örneğin, grep -r string *.txtyalnızca geçerli dizindeki dosyaları verir; alt dizinlerdekiler değil.
  2. find-exectüm --null … |xargs 0yapıya olan ihtiyacı ortadan kaldıran güçlü bir seçenek ile birlikte gelir .
  3. -readableVe -writablebir seçenek finderişilemiyor dosyalar üzerinde vakit önleyecektir.

Çekim testi

Bununla birlikte, grepneyin yakalanacağını görmek için ilk test için ödünç verilir:

$ find . -exec grep term1 {} \;

veya daha spesifik olarak:

$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;

Kuru çalışma

Şimdi, sedkuru bir koşu ile devam edin . sedSeçenek -neş anlamlıdır --quietve pen sonunda sedifade akım desen alanı yazdırılır.

$ find . -exec sed -n 's/term1/term2/gp' {} \;

veya daha spesifik olarak:

$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;

infaz

Herşey yolunda görünüyorsa, değiştirerek kesin komutu sedseçeneğini -ntarafından -i"yerinde" ve kaldırarak psonunda.

$ find . -exec sed -i 's/term1/term2/g' {} \;

veya daha spesifik olarak:

$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;

Diğer findörnekler

Daha fazla findörnek burada bulunabilir .

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.