sed tam dosya sisteminde yerinde satır silme?


11

Henüz teşhis edilmemiş bir uygulama hatası nedeniyle, tam diske sahip birkaç yüz sunucum var. Yinelenen satırlarla doldurulmuş bir dosya var - bir günlük dosyası değil, değişken tanımları olan bir kullanıcı ortamı dosyası (bu yüzden sadece dosyayı silemiyorum).

sedHatalı eklenen satırları kontrol etmek ve silmek için basit bir komut yazdım ve dosyanın yerel bir kopyasında test ettim. Amaçlandığı gibi çalıştı.

Ancak, tam disk ile sunucuda denediğimde, yaklaşık olarak aşağıdaki hatayı aldım (hafızadan değil, kopyalayıp yapıştırmadan):

sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname

Tabii ki boş yer kaldığını biliyorum . Bu yüzden bir şeyler silmeye çalışıyorum! (Kullandığım sedkomut 4000+ satır dosyasını yaklaşık 90 satıra indirecektir.)

Benim sedemrim sadecesed -i '/myregex/d' /path/to/file/filename

Tam diske rağmen bu komutu uygulayabilmemin bir yolu var mı?

(Otomatikleştirilmelidir, çünkü hızlı bir şekilde birkaç yüz sunucuya uygulamam gerekir.)

(Açıkçası uygulama hatası teşhis edilmesi gerekiyor, ancak bu arada sunucular düzgün çalışmıyor ....)


Güncelleme: Karşılaştığım durum, silebildiğimi öğrendiğim başka bir şeyi silerek çözüldü, ancak yine de gelecekte ve diğer insanlar için yararlı olacak bu sorunun cevabını istiyorum .

/tmphareketsizdir; aynı dosya sisteminde.

Disk alanını boşaltmadan önce vi, dosyayı açıp çalıştırarak satırları silebildiğimi test ettim :g/myregex/dve değişiklikleri başarıyla kaydettim :wq. Geçici bir dosyayı tutmak için ayrı bir dosya sistemine başvurmadan bunu otomatikleştirmek mümkün görünmektedir .... (?)



1
sed -iüzerinde çalışmak üzere geçici bir kopya oluşturur. Bunun ediçin daha iyi olacağından şüpheleniyorum , ancak gerçek bir çözümü yasaklayacak kadar tanıdık değilim
Eric Renouf

2
İle edkaçmayacağınızı: printf %s\\n g/myregex/d w q | ed -s infileama akılda tutmak gibi bazı uygulamaları da geçici dosyaları kullanmak sed(deneyebilirsin busybox ed - bu geçici bir dosya yaratmaz afaik)
don_crissti

1
@Wildcard - güvenilir değil w / echo. kullanın printf. ve sedson satırda bıraktığınız karakterleri ekleyin, böylece boşlukları kaybetmekten kaçının. Ayrıca, kabuğunuzun tüm dosyayı tek bir komut satırında işleyebilmesi gerekir. bu sizin riskiniz - önce test edin. bashözellikle kötü (onun w / yığın alan yapmak düşünüyorum?) ve her zaman size hasta olabilir. iki sed'si en azından çekirdeğin boru tamponunu aralarında iyi etki yaratacak şekilde kullanır, ancak yöntem oldukça benzerdir. komut alt öğeniz filesed w / in öğesinin başarılı olup olmadığını da keser .
mikeserv

1
@Wildcard - deneyin sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}ve çalışırsa cevabımın geri kalanını okuyun. '
mikeserv

Yanıtlar:


10

Bu -iseçenek orijinal dosyanın üzerine yazmaz. Çıktı ile yeni bir dosya oluşturur, ardından orijinal dosya adına yeniden adlandırır. Bu yeni dosya için dosya sisteminde yer olmadığından başarısız olur.

Bunu kendiniz betiğinizde yapmanız gerekir, ancak yeni dosyayı farklı bir dosya sisteminde oluşturmanız gerekir.

Ayrıca, yalnızca normal ifadeyle eşleşen satırları siliyorsanız grepbunun yerine kullanabilirsiniz sed.

grep -v 'myregex' /path/to/filename > /tmp/filename && mv /tmp/filename /path/to/filename

Genel olarak, programların giriş ve çıkışlarla aynı dosyayı kullanması nadiren mümkündür - dosyaya yazmaya başlar başlamaz, programın dosyadan okuyan kısmı artık orijinal içeriği görmez. Bu yüzden önce orijinal dosyayı bir yere kopyalamalı veya yeni bir dosyaya yazmalı ve bittiğinde yeniden adlandırmalıdır.

Geçici bir dosya kullanmak istemiyorsanız, dosya içeriğini bellekteki önbelleğe almayı deneyebilirsiniz:

file=$(< /path/to/filename)
echo "$file" | grep -v 'myregex' > /path/to/filename

1
İzinleri, mülkiyeti ve zaman damgalarını korudu mu? Belki rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"dan burada
Hastur

@Hastur - sed -ibu şeyleri koruduğunu mu ima ediyorsun ?
mikeserv

2
@ Hastur bunlardan sed -ihiçbirini korumaz. Sadece sahip olmadığım bir dosyayla denedim, ancak sahip olduğum bir dizinde buldum ve dosyayı değiştirmeme izin ver. Değiştirmenin sahibi bana aittir, orijinal sahibi değil.
Barmar

1
@ RalphRönnquist Emin olmak için iki adımda yapmanız gerekir:var=$(< FILE); echo "$FILE" | grep '^"' > FILE
Barmar

1
@Barmar - işe yaramıyor - girdiyi başarıyla açtığınızı bile bilmiyorsunuz. Çok Yapabileceğiniz azından v=$(<file)&& printf %s\\n "$v" >fileama hatta kullanmayın &&. Sorucunun bir komut dosyasında çalıştırılması hakkında konuşması - dosyanın bir kısmının üzerine yazılmasını otomatik hale getirme. en azından giriş ve çıkışı başarıyla açabildiğinizi doğrulamanız gerekir. Ayrıca, kabuk patlayabilir.
mikeserv

4

İşte böyle sedçalışır. -i(Yerinde düzenleme) ile kullanılırsa sed, işlenen dosyanın yeni içeriğiyle geçici bir dosya oluşturur. Tamamlandığında sed, geçerli çalışma dosyasını geçici olanla değiştirir. Yardımcı program dosyayı yerinde düzenlemez . Her editörün davranışı budur.

Aşağıdaki görevi bir kabukta yaptığınız gibi:

sed 'whatever' file >tmp_file
mv tmp_file file

Bu noktada sed, fflush()sistem çağrısı ile hata mesajında ​​belirtilen dosyaya arabelleğe alınan verileri temizlemeye çalışır :

Çıktı akışları fflush()için, akışın temeldeki yazma işlevi aracılığıyla belirli bir çıktı veya güncelleme akışı için tüm kullanıcı alanı tamponlu verilerinin yazılmasını zorlar.


Sorununuz için, ayrı bir dosya sistemi (örneğin tmpfs, yeterli belleğiniz veya harici bir depolama aygıtınız varsa) montajında ​​bir çözüm görüyorum ve bazı dosyaları oraya taşıyın, orada işleyin ve geri taşıyın.


3

Bu soruyu gönderdikten sonra exPOSIX uyumlu bir program olduğunu öğrendim . Neredeyse evrensel olarak bağlandı vim, ancak her iki durumda da, (sanırım) exdosya sistemleriyle ilgili (POSIX belirtiminden alınmıştır ) önemli bir nokta :

Bu bölüm , geçerli çalışan metni tanımlamak için düzenleme arabelleği terimini kullanır . Bu terim belirli bir uygulamayı ima etmez. Tüm düzenleme değişiklikleri, düzenleme arabelleğinde gerçekleştirilir ve herhangi bir değişiklik, bir editör komutu dosyayı yazana kadar herhangi bir dosyayı etkilemez.

"... herhangi bir dosyayı etkileyecektir ..." Dosya sistemine bir şey (hiç geçici bir dosya bile) koymanın " herhangi bir dosyayı etkileme " olarak değerlendireceğine inanıyorum. Olabilir?*

POSIX spesifikasyonlarınınex dikkatli bir şekilde araştırılması, exçevrimiçi olarak bulunan ( vim-özel komutlarla doludur ) yaygın olarak kullanılan komut dosyası kullanımlarıyla karşılaştırıldığında, amaçlanan taşınabilir kullanımı hakkında bazı "gotchas" ı gösterir .

  1. POSIX'e +cmdgöre uygulama isteğe bağlıdır.
  2. Birden fazla -cseçeneğe izin vermek de isteğe bağlıdır.
  3. Global komut, :gher şeyi bir sonraki kaçamayan yeni satıra kadar "yiyor" (ve bu nedenle, sonunda bir kez değil, normal ifade için bulunan her maçtan sonra çalıştırıyor). Bu nedenle, -c 'g/regex/d | x'yalnızca bir örneği siler ve ardından dosyadan çıkar.

Araştırdıklarıma göre, belirli bir normal ifadeyle eşleşen tüm satırları silmek için tam dosya sistemindeki bir dosyayı yerinde düzenlemek için POSIX uyumlu yöntem:

ex -sc 'g/myregex/d
x' /path/to/file/filename

Bu, dosyayı bir tampona yüklemek için yeterli belleğe sahip olmanız koşuluyla çalışmalıdır.

* Aksi gösteren bir şey bulursanız, lütfen yorumlarda belirtin.


2
ama eski tmpfiles yazar ... her zaman. arabelleklerini düzenli aralıklarla diske yazması gerekiyordu. diskte tmp dosya arabelleklerini bulmak için spec'd komutları bile vardır.
mikeserv

@Wildcard Paylaştığınız için teşekkürler, SO'daki benzer gönderide bağlantı kurdum . Ben varsayalım ex +g/match/d -scx filePOSIX uyumlu yanı nedir?
kenorb

@kenorb, tam olarak değil, özellikleri okumaya göre - yukarıdaki cevapta 1. noktaya bakın. POSIX'ten kesin fiyat teklifi: "Eski yardımcı program," - "ifadesinin belirtilmemiş kullanımı hariç olmak üzere XBD Yardımcı Programı Sözdizimi Yönergeleri'ne uygun olacaktır ve " + " , " - "yanı sıra bir seçenek sınırlayıcısı olarak kabul edilebilir."
Joker

1
Sağduyuya itiraz dışında bunu kanıtlayamıyorum, ancak bu ifadeye gerçekten orada olduğundan daha fazla açıklama okuduğunuza inanıyorum. Daha güvenli yorumlamanın, düzenleme arabelleğindeki hiçbir değişikliğin, düzenleme oturumu başlamadan önce var olan herhangi bir dosyayı etkilememesi veya kullanıcının adlandırmasıdır. Cevabım hakkındaki yorumlarıma da bakınız.
G-Man,

@ G-Man, aslında haklı olduğunu düşünüyorum; ilk yorumum büyük olasılıkla arzulu bir düşüncedir. Ancak, dosyayı düzenlemek tam bir dosya sisteminde vi çalıştığından , çoğu durumda da işe yarayacağına inanıyorum - exbelki de büyük bir dosya için değil. sed -idosya boyutundan bağımsız olarak tam bir dosya sisteminde çalışmaz.
Wildcard

2

Boruyu kullan, Luke!

Dosyayı oku | filtre | cevap yazmak

sed 's/PATTERN//' BIGFILE | dd of=BIGFILE conv=notrunc

bu durumda sedyeni bir dosya oluşturmaz ve sadece aynı dosyayıdd açan çıktı çıktısı gönderir . Tabii ki özel durumlardagrep

grep -v 'PATTERN' BIGFILE | dd of=BIGFILE conv=notrunc

Daha sonra kesik kalmıştır.

dd if=/dev/null of=BIGFILE seek=1 bs=BYTES_OF_SED_OUTPUT

1
Sorunun "tam dosya sistemi" bölümünü fark ettiniz mi?
Wildcard

1
@Wildcard, her sedzaman geçici dosyalar kullanıyor mu? grepNeyse olmayacak
Leben Gleben

Bu spongekomuta alternatifi gibi görünüyor . Evet, sedbirlikte -ihep 000 haklara sahip "seduyUdmw" lilke dosyalar oluşturur.
Pablo A

1

Diğer yanıtlarda belirtildiği gibi sed -i, dosyayı aynı dizinde yeni bir dosyaya kopyalayarak , işlemde değişiklikler yaparak ve ardından yeni dosyayı orijinalin üzerine taşıyarak çalışır. Bu yüzden işe yaramıyor.  ed(orijinal çizgi editörü) biraz benzer bir şekilde çalışır, ancak son kontrol ettiğimde /tmp, çizik dosyası için kullanır . Bilgisayarınız /tmpdolu olandan farklı bir dosya sistemindeyse ed, işi sizin için yapabilir.

Bunu deneyin (etkileşimli kabuk isteminizde):

$ ed / path / to / file / dosyaadı
P
g / myregex / d
w
q

P(A hangi sermaye P) kesinlikle gerekli değildir. İstemi açar; Onsuz, karanlıkta çalışıyorsunuz ve bazı insanlar bunu rahatsız ediyor. wVe qvardır ağırlık usül ve q uit.

edşifreli teşhis için kötü şöhretlidir. Herhangi bir noktada o (ki istemi olduğunu başka bir şey gösteriyorsa *açıkça başarılı operasyon (bir teyidi olduğunu) ya da bir şey özellikle bir içeriyorsa ?,) yok (dosyayı yazma w). Sadece çıkın ( q). Sizi dışarı çıkarmazsa, qtekrar söylemeyi deneyin .

Senin Eğer /tmpdizin dolu bir dosya sisteminde (kendi dosya sistemi de, doluysa veya), biraz boşluk bir yere bulmaya çalışın. bir tmpfs veya bir harici depolama aygıtı (örneğin, bir flash sürücü) monte edilmesinde belirtilen kaos; ancak, birden fazla dosya sisteminiz varsa ve bunların tamamı dolu değilse , diğer mevcut sistemlerden birini kullanabilirsiniz. chaos, dosya (lar) ı diğer dosya sistemine sedkopyalamanızı, orada (ile ) düzenlemenizi ve sonra tekrar kopyalamanızı önerir . Bu noktada, bu en basit çözüm olabilir. Ancak bir alternatif, boş alanı olan bir dosya sisteminde yazılabilir bir dizin oluşturmak, ortam değişkenini TMPDIRbu dizine işaret edecek şekilde ayarlamak ve daha sonra çalıştırmak olabilir ed. (Açıklama: Bunun işe yarayıp yaramayacağından emin değilim, ama incinemez.)

edÇalışmaya başladıktan sonra , bunu otomatikleştirebilirsiniz.

ed dosya adı << EOF
g / myregex / d
w
q
EOF

bir senaryoda. Veya , don_crissti tarafından önerildiği gibi.printf '%s\n' 'g/myregex/d' w q | ed -s filename


Hmmm. Aynı şey , bellek ayrı bir dosya sistemi yerine kullanılacak şekilde (ya ile edya da ile ex) yapılabilir mi? Gerçekten bunu yapıyordum (ve bir yanıtı kabul
Wildcard

Hmm. Bu fark ettiğimden daha karmaşık olabilir. edYıllar önce kaynağını inceledim . İşlemlerin 64K (!) Adres alanıyla sınırlı olduğu 16 bit bilgisayarlar gibi şeyler hala vardı, bu nedenle tüm dosyayı belleğe okuyan bir düzenleyicinin fikri bir başlangıç ​​değildi. O zamandan beri, elbette, bellek büyüdü - ancak diskler ve dosyalar da var. Diskler çok büyük olduğundan, insanlar alanın dolması olasılığını ele almaya ihtiyaç duymazlar /tmp. Az önce yeni bir versiyonunun kaynak koduna hızlıca baktım edve hala görünüyor ... (Devamı)
G-Man 'Reinstate Monica' diyor

(Devam)… “edit buffer” ı koşulsuz olarak geçici bir dosya olarak uygulamak için - ve ed(veya exveya vi) herhangi bir versiyonunun arabelleği bellekte tutma seçeneği sunduğuna dair herhangi bir gösterge bulamıyorum .  Öte yandan, ed ve vi ile Metin Düzenleme - Bölüm 11: Metin İşleme - Bölüm II: Red Hat Linux'u Keşfetmek - Red Hat Linux 9 Profesyonel Sırlar - Linux sistemleri , eddüzenleme arabelleğinin bellekte olduğunu söylüyor … (Devamı )
G-Man

(Devamı)… ve Balasubramaniam Srinivasan tarafından UNIX Belge İşleme ve Dizgi , aynı şeyi söylüyor vi(ki bu aynı programdır ex). Sadece özensiz, kesin olmayan ifadeler kullandıklarına inanıyorum - ama eğer internette (veya basılıysa), doğru olmalı, değil mi? Paranızı ödersiniz ve seçiminizi yaparsınız.
G-Man,

Her neyse, yeni bir cevap ekledim.
G-Man,

1

Ofsetinize bayt sayısını alabiliyorsanız ve satırlarınız bir başlangıç ​​noktasından sonuna kadar olursa, dosyayı oldukça kolay bir şekilde kısaltabilirsiniz.

o=$(sed -ne'/regex/q;p' <file|wc -c)
dd if=/dev/null of=file bs="$o" seek=1

Veya başka bir ${TMPDIR:-/tmp}dosya sistemindeyseniz:

{   cut -c2- | sed "$script" >file
} <file <<FILE
$(paste /dev/null -)
FILE

Çünkü (çoğu) mermiler burada belgelerini silinmiş bir geçici dosyaya koyarlar. <<FILETanımlayıcı başlangıçtan bitişe kadar korunduğu ve ${TMPDIR:-/tmp}ihtiyaç duyduğunuz kadar alana sahip olduğu sürece mükemmel güvenlidir .

Geçici dosyaları kullanmayan kabuklar boru kullanır ve bu nedenle bu şekilde kullanmak güvenli değildir. Bu kabuklar, tipik olarak ashbenzeri türevleri busybox, dashBSD sh- zsh, bash, kshve Bourne kabuğu, bununla birlikte, bütün kullanım geçici dosyaları.

Görünüşe göre geçen Temmuz'da böyle bir şey yapmak için küçük bir kabuk programı yazdım


Eğer /tmpçok uzun gibi hafıza şey dosyayı sığabilecek kadar sonra, canlı değil ...

sed 'H;$!d;x' <file | { read v &&
sed "$script" >file;}

... genel bir durum olarak, sediçeri / dışarı dosyasını kısaltmaya çalışmadan önce en azından dosyanın ilk işlem tarafından tamamen arabelleğe alınmasını sağlar .

Daha hedefli ve verimli bir çözüm şöyle olabilir:

sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}

... çünkü yine de silmek istediğiniz tamponlama hatlarını rahatsız etmeyecekti.

Genel davanın testi:

{   nums=/tmp/nums
    seq 1000000 >$nums
    ls -lh "$nums"
    wc -l  "$nums"
    sed 'H;$!d;x' <$nums | { read script &&  ### read always gets a blank
    sed "$script" >$nums;}
    wc -l  "$nums"
    ls -lh "$nums"
}

-rw-r--r-- 1 mikeserv mikeserv 6.6M Dec 22 20:26 /tmp/nums
1000000 /tmp/nums
1000000 /tmp/nums
-rw-r--r-- 1 mikeserv mikeserv 6.6M Dec 22 20:26 /tmp/nums

İtirafınızı daha önce ayrıntılı olarak okumadığımı itiraf ediyorum, çünkü bayt sayımı (birçok sunucunun her biri arasında farklı) /tmpiçeren ve aynı dosya sisteminde bulunan işlenemez (benim için) çözümlerle başlar . İkili sedversiyonunu beğendim . Sanırım Barmar'ın ve cevabınızın bir kombinasyonu muhtemelen en iyisi olacaktı: myvar="$(sed '/myregex/d' < file)" && [ -n "$myvar" ] && echo "$myvar" > file ; unset myvar (Bu durumda, sondaki yeni satırları korumakla ilgilenmiyorum.)
Wildcard

2
@Wildcard - olabilir. ancak kabuğu veritabanı gibi kullanmamalısınız. sed| catYukarıdaki dosya hiçbir zamansed tüm dosyayı arabelleğe almadıysa ve çıktıya yazmaya yazmaya hazır olmadığı sürece hiçbir zaman çıktıyı açmaz. Dosyayı arabelleğe almaya çalışırsa ve başarısız olursa - readbaşarılı olmaz çünkü EOF'u ilk satırsonunu okumadan önce| boruda bulur ve bu yüzden asla bellekten tamamen yazma zamanı gelene kadar olmaz . bir taşma ya da onun gibi bir şey başarısız olur. ayrıca tüm boru hattı her seferinde başarı veya başarısızlık döndürür. onu bir varda saklamak daha risklidir. cat >out
mikeserv

@Wildcard - eğer gerçekten bir değişkente istedim, ben id gibi yapmak düşünüyorum: file=$(sed '/regex/!H;$!d;x' <file | read v && tee file) && cmp - file <<<"$file" || shiteböylece çıktı dosyası ve var aynı anda yazılacak, ya da ya etkili bir yedekleme yapacak , hangi sen istemek tek nedeni gerekenden daha karmaşık hale getirir.
mikeserv

@mikeserv: Şu anda OP ile aynı sorunu yaşıyorum ve çözümünüzü gerçekten yararlı buluyorum. Ama cevabınızın read scriptve read vcevabınızın kullanımını anlamıyorum . Bu konuda daha fazla ayrıntı verebilirseniz çok takdir edilecektir, teşekkürler!
sylye

1
@sylye - $scriptolduğu sedistediğin dosyanızın ne olursa olsun bölümünü hedeflemek için kullanacağı komut; akışta istediğiniz sonucu elde etmenizi sağlayan komut dosyasıdır. vyalnızca boş bir satır için bir yer tutucudur. bir bashkabukta gerekli değildir, çünkü bir belirtmezseniz bashotomatik olarak $REPLYkabuk değişkenini yerine kullanır , ancak POSIXly bunu her zaman yapmalısınız. Bu arada, yararlı bulduğunuza sevindim. onunla iyi şanslar. im mikeserv @ gmail derinlemesine bir şeye ihtiyacınız varsa. birkaç gün içinde tekrar bir bilgisayar olmalı
mikeserv

0

Bu yanıt, bu diğer yanıttan ve bu diğer yanıttan fikirler alır, ancak bunlara dayanarak daha genel olarak uygulanabilir bir yanıt oluşturur:

num_bytes = $ (sed '/ myregex / d' / yol / dosya / dosya / dosya adı | wc -c)
sed '/ myregex / d' / yol / dosya / dosya / dosya adı 1 <> / yol / dosya / dosya / dosyaadı 
dd = / dev / = / yol / to / dosya / dosyaadı bs = "$ num_bytes" araması = 1

İlk satır, sedkomutu standart çıktıya yazılan komutla çalıştırır (bir dosyaya değil); özellikle, wckarakterleri saymak için bir boruya . İkinci satır ayrıca sed, standart çıktıya yazılan çıktı ile komutu çalıştırır, bu durumda burada tartışılan okuma / yazma üzerine yazma (kesme yok) modunda giriş dosyasına yönlendirilir . Bu biraz tehlikeli bir şey; yalnızca filtre komutu asla veri miktarını (metin) artırmazsa güvenlidir ; yani okuduğu her n bayt için n veya daha az bayt yazar . Bu, elbette, sed '/myregex/d'komut için doğrudur ; okuduğu her satır için aynı satırı yazar ya da hiçbir şey yazmaz. (Diğer örnekler:s/foo/fu/veya s/foo/bar/güvenli olurdu ama s/fu/foo/ve s/foo/foobar/olmaz.)

Örneğin:

$ cat filename
It was
a dark and stormy night.
$ sed '/was/d' filename 1<> filename
$ cat filename
a dark and stormy night.
night.

çünkü bu 32 bayt veri:

I  t     w  a  s \n  a     d  a  r  k     a  n  d     s  t  o  r  m  y     n  i  g  h  t  . \n

şu 25 karakterle üzerine yazılmıştır:

a     d  a  r  k     a  n  d     s  t  o  r  m  y     n  i  g  h  t  . \n

sonunda yedi bayt night.\nkaldı.

Son olarak, ddkomut yeni, temizlenmiş verilerin (bu örnekte bayt 25) sonuna kadar gider ve dosyanın geri kalanını kaldırır; yani, dosyayı bu noktada keser.


Herhangi bir nedenle, 1<>hile işe yaramazsa,

sed '/ myregex / d' / yol / dosya / dosya / dosya adı | = / yol / dosya / dosya / dosya adının gg = notrunc

Ayrıca, yaptığınız tek şey çizgileri kaldırmak olduğu sürece, tek ihtiyacınız olanıngrep -v myregex ( Barmar tarafından işaret edildiği gibi ) olduğunu unutmayın.


-3

sed -i 'd' / yol / dosya / dosya / dosya adı


1
Selam! Çözümünüzün nasıl çalıştığı ve soruyu cevapladığı konu ile ilgili olduğu kadar ayrıntılı açıklamak en iyisi olacaktır.
dhag

2
Bu korkunç bir cevap değil. (a) Orijinal komutum gibi tam bir dosya sisteminde başarısız olur; (b) Başarılı olursa, regex'imle eşleşen satırlar yerine WHOLE dosyasını boşaltır.
Joker
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.