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 -i
sakelar sed
:
sed -i.bak '/^HERE IT IS/d' <file>
File asli akan tetap <file>.bak
dan 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 grep
dan yang sed
Anda 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 -i
peralihan 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 awk
pada 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
bash
membuat 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.py
dan 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
vim
sepertivim '+g/^HERE IT IS/d' +wq test.txt