Ç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 -ianahtarını kullanırken yedek almak daha iyidir sed:
sed -i.bak '/^HERE IT IS/d' <file>
Orijinal dosya olduğu gibi kalır <file>.bakve 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 grepve sedcevaplara 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
-iDosyayı 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( awkLinux'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
bashbiri 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 -rkadar 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.pyve 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;)