Pertanyaan Hapus baris dalam file teks yang berisi string tertentu


Bagaimana saya menggunakan sed untuk menghapus semua baris dalam file teks yang berisi string tertentu?


1319
2018-03-23 19:46


asal


Jawaban:


Untuk menghapus garis dan mencetak output ke standar:

sed '/pattern to match/d' ./infile

Untuk langsung memodifikasi file:

sed -i '/pattern to match/d' ./infile

Untuk langsung memodifikasi file (dan membuat cadangan):

sed -i.bak '/pattern to match/d' ./infile

Untuk pengguna Mac OS X:

sed -i '' '/pattern/d' ./infile

1978
2018-03-23 19:48



ada banyak cara lain untuk menghapus garis dengan string tertentu sed

awk

awk '!/pattern/' file > temp && mv temp file

Ruby (1.9+)

ruby -i.bak -ne 'print if not /test/' file

Perl

perl -ni.bak -e "print unless /pattern/" file

Shell (bash3.2 +)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done <file > o 
mv o file

GNU grep

grep -v "pattern" file > temp && mv temp file

dan tentu saja sed (Mencetak invers lebih cepat dari penghapusan yang sebenarnya.)

sed -n '/pattern/!p' file 

523
2018-03-23 23:57



Anda dapat menggunakan sed untuk mengganti baris yang ada di file. Namun, tampaknya jauh lebih lambat daripada menggunakan grep untuk invers ke file kedua dan kemudian memindahkan file kedua dari aslinya.

misalnya

sed -i '/pattern/d' filename      

atau

grep -v "pattern" filename > filename2; mv filename2 filename

Perintah pertama membutuhkan waktu 3 kali lebih lama di mesin saya.


187
2017-11-02 02:37



Cara mudah melakukannya, dengan GNU sed:

sed --in-place '/some string here/d' yourfile

51
2018-01-02 17:56



Anda dapat mempertimbangkan untuk menggunakan ex (yang merupakan editor berbasis perintah UNIX standar):

ex +g/match/d -cwq file

dimana:

  • + mengeksekusi perintah Ex yang diberikan (man ex), sama dengan -c yang mengeksekusi wq (tulis dan berhenti)
  • g/match/d - Ex perintah untuk menghapus garis dengan yang diberikan match, Lihat: Kekuatan g

Contoh di atas adalah metode POSIX-compliant untuk di-tempat mengedit file sesuai ini posting di Unix.SE dan Spesifikasi POSIX untuk ex.


Perbedaannya dengan sed Apakah itu:

sed adalah Stream EDitor, bukan editor file.BashFAQ

kecuali Anda menikmati kode yang tidak sesuai, overhead I / O dan beberapa efek samping buruk lainnya. Jadi pada dasarnya beberapa parameter (seperti di tempat /-i) adalah ekstensi FreeBSD non-standar dan mungkin tidak tersedia pada sistem operasi lain.


25
2017-10-17 11:54



Saya berjuang dengan ini di Mac. Selain itu, saya perlu melakukannya menggunakan penggantian variabel. Jadi saya menggunakan:

sed -i '' "/$pattern/d" $file

dimana $file adalah file di mana penghapusan diperlukan dan $pattern adalah pola yang harus dicocokkan untuk dihapus. Memilih '' dari ini komentar. Hal yang perlu diperhatikan di sini adalah penggunaan tanda kutip ganda di "/$pattern/d". Variabel tidak akan berfungsi ketika kita menggunakan satu kutipan.


13
2018-03-09 15:39



Untuk mendapatkan hasil seperti di tempat grep kamu bisa melakukan ini:

echo "$(grep -v "pattern" filename)" >filename

12
2018-06-13 19:24



Saya telah membuat patokan kecil dengan file yang berisi sekitar 345 000 baris. Jalan dengan grep tampaknya sekitar 15 kali lebih cepat daripada sed metode dalam kasus ini.

Saya telah mencoba keduanya dengan dan tanpa pengaturan LC_ALL = C, sepertinya tidak mengubah timing secara signifikan. String pencarian (CDGA_00004.pdbqt.gz.tar) ada di suatu tempat di tengah file.

Berikut adalah perintah dan pengaturan waktunya:

time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt

real    0m0.711s
user    0m0.179s
sys     0m0.530s

time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt

real    0m0.105s
user    0m0.088s
sys     0m0.016s

time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )

real    0m0.046s
user    0m0.014s
sys     0m0.019s

10
2018-03-19 12:45



SED:

AWK:

GREP:


8
2017-08-25 08:21



Anda dapat menggunakan ini juga

 grep -v 'pattern' filename

di sini -v hanya akan mencetak selain dari pola Anda (itu berarti Invert match)


7
2018-03-28 07:11



echo -e "/thing_to_delete\ndd\033:x\n" | vim file_to_edit.txt


2
2017-09-16 23:51