Çok satır içeren bir dosyada ile başlayan satırları silmek istiyorum HERE IT IS
.
Bunu yalnızca komut satırı araçlarını kullanarak nasıl yapabilirim?
Çok satır içeren bir dosyada ile başlayan satırları silmek istiyorum HERE IT IS
.
Bunu yalnızca komut satırı araçlarını kullanarak nasıl yapabilirim?
Yanıtlar:
Deneyin sed
:
sed -i '/^HERE IT IS/d' <file>
UYARI: Şunların -i
anahtarını kullanırken yedek almak daha iyidir sed
:
sed -i.bak '/^HERE IT IS/d' <file>
Orijinal dosya olduğu gibi kalır <file>.bak
ve değiştirilen dosya kalır <file>
.
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
.
Aldığınız çok iyi grep
ve sed
cevaplara ek olarak , aynı şeyi yapabilen diğer bazı araçlar:
Birkaç Perl yolu:
perl -ne '/^HERE IT IS/ || print' file > newfile
perl -ne 'print if !/^HERE IT IS/' file > newfile
perl -ne 'print unless /^HERE IT IS/' file > newfile
-i
Dosyayı yerinde düzenlemek için anahtarı örneklerden herhangi birine ekleyebilirsiniz :
perl -i.bak -ne '/^HERE IT IS/ || print' file
(G) awk
awk '!/^HERE IT IS/' file > newfile
GNU'nun awk
( awk
Linux'ta varsayılan ) daha yeni sürümleri (4.1.1 ve üstü) dosyayı yerinde de düzenleyebilir:
gawk -i inplace '!/^HERE IT IS/' file
Kabuk ( bash
, zsh
, ksh
, muhtemelen diğerleri). Bu tür saçma olsa arasında öyle olabilir yapılabilir ancak diğer araçlar iyidir.
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bash
biri beni LOL yaptı)
printf "%s\n" "$line"
: beyaz boşlukları korumak için $ satırından alıntı yapmak ve bazı yankı problemlerinden kaçınmak (özel karakterleri yorumlamak vb.). ve ekleme ihtiyacını ortadan kaldırır --
.
IFS=
ve sonuna -r
kadar gidip sağlamlaştırabilirim .
sed
kesinlikle gitmenin yolu.
@Heemayl komutunun bu küçük değişikliği, desen referansındaki I nedeniyle aynı durumun kalıpta kullanılıp kullanılmadığını siler.
sed -i '/HERE IT IS/Id' <file>
Eğer bir dizinde bunu yapmak istediğiniz birkaç dosya varsa, onu böyle bul ile birleştirebilirsiniz.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
Maxdepth seçeneği, bunun dizinlere geri çekilmeyeceği anlamına gelir.
Başka bir python seçeneği:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Burada f, tırnak işaretleri arasındaki dosyanın yoludur.
grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
Normal ifade motorunu, yalnızca dizeyle takip edilmiyorsa tüm satır başlangıç sınırıyla ( genellikle eşleşir^
) eşleşecek şekilde yapan negatif ileriye dönük iddiaHERE IT IS
piton
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
Komut dosyasını bir dosyaya kaydedin, deyin script.py
ve terminaldeki aşağıdaki komutla çalıştırın.
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, ama daha verimli değil startswith
. [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Çıktıyı bir listede nasıl üretmeyeceğini merak ettim .
Vim'i Ex modunda kullanabilirsiniz:
ex -sc 'g/^HERE IT IS/d' -cx file
g
küresel arama
d
silmek
x
kaydet ve kapat
vim
şöyle:vim '+g/^HERE IT IS/d' +wq test.txt
;)