Dalam file dengan banyak baris saya ingin menghapus baris yang dimulai dengan HERE IT IS.
Bagaimana saya bisa melakukan ini hanya dengan menggunakan alat baris perintah?
Dalam file dengan banyak baris saya ingin menghapus baris yang dimulai dengan HERE IT IS.
Bagaimana saya bisa melakukan ini hanya dengan menggunakan alat baris perintah?
Jawaban:
Coba sed:
sed -i '/^HERE IT IS/d' <file>
PERINGATAN: Lebih baik mengambil cadangan saat menggunakan -isakelar sed:
sed -i.bak '/^HERE IT IS/d' <file>
File asli akan tetap <file>.bakdan file yang diubah akan <file>.
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file.
Selain jawaban yang sangat bagus grepdan yang sedAnda terima, berikut adalah beberapa alat lain yang dapat melakukan hal yang sama:
Beberapa cara Perl:
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
Anda dapat menambahkan -iperalihan ke salah satu contoh untuk mengedit file di tempat:
perl -i.bak -ne '/^HERE IT IS/ || print' file
(melongo
awk '!/^HERE IT IS/' file > newfile
Versi yang lebih baru (4.1.1 dan yang lebih baru) dari GNU awk(default awkpada Linux) juga dapat mengedit file di tempat:
gawk -i inplace '!/^HERE IT IS/' file
Shell ( bash, zsh, ksh, mungkin orang lain). Ini agak konyol, itu bisa dilakukan tetapi alat lain lebih baik.
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bashmembuat saya LOL)
printf "%s\n" "$line": mengutip $ line untuk mempertahankan spasi putih, dan menghindari beberapa masalah gema (menafsirkan karakter khusus, dll). dan menghindari kebutuhan untuk menambahkan --juga.
IFS=dan -r, saya mungkin juga berusaha keras dan membuatnya kuat.
sed jelas merupakan cara untuk pergi.
Ini sedikit modifikasi dari perintah @heemayl memberi Anda akan menghapus baris apakah kasus yang sama digunakan dalam pola atau tidak, karena I dalam referensi pola.
sed -i '/HERE IT IS/Id' <file>
Jika Anda memiliki beberapa file dalam direktori yang Anda inginkan, Anda dapat menggabungkannya dengan find seperti itu.
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
Opsi maxdepth berarti ini tidak akan muncul kembali ke direktori.
Opsi python lain:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
Di mana f adalah path ke file, di antara tanda kutip.
Grep
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)pernyataan lookahead negatif yang membuat mesin regex untuk mencocokkan semua garis batas mulai ( yang biasanya cocok dengan^ ) hanya jika tidak diikuti oleh stringHERE IT IS
ular sanca
#!/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="")
Simpan skrip dalam file, ucapkan script.pydan kemudian jalankan melalui perintah di bawah ini di terminal.
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)], tapi itu tidak jauh lebih efisien daripada startswith. Saya bertanya-tanya bagaimana [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]tidak akan menghasilkan output dalam daftar.
Anda dapat menggunakan Vim dalam mode Ex:
ex -sc 'g/^HERE IT IS/d' -cx file
g pencarian global
d menghapus
x Simpan dan tutup
vimsepertivim '+g/^HERE IT IS/d' +wq test.txt