Saya ingin menggunakan sed
atau perl
mengganti semua kemunculan kata yang tidak memiliki kata tertentu di depannya.
Misalnya, saya memiliki file teks yang berisi plot film dan saya ingin mengganti semua kemunculan nama belakang karakter dengan nama depan mereka, tetapi hanya jika nama depan mereka tidak muncul tepat sebelum nama belakang mereka.
Contoh teks mungkin terlihat seperti ini:
John Smith and Jane Johnson talk about Smith's car.
Saya ingin terlihat seperti ini:
John Smith and Jane Johnson talk about John's car.
Jika saya melakukannya sed 's/Smith/John/' file
, maka saya akan memiliki:
John John and Jane Johnson talk about John's car.
Nama depan yang muncul sebelum nama belakang akan selalu sama. Saya tidak harus berurusan dengan John Smith
dan Frank Smith
. Saya hanya perlu cara untuk mencocokkan Smith
yang tidak ada John
sebelumnya.
sed
regular-expression
perl
jonescb
sumber
sumber
Jawaban:
Akan mudah dengan bahasa apa pun di mana ekspresi reguler mampu terlihat di belakang. Tentu saja, Perl adalah yang pertama dalam daftar:
Kelemahannya adalah memiliki lebih dari satu karakter non-kata antara "John" dan "Smith". Sayangnya quantifier seperti
+
for\W
akan memunculkan error “Variable length lookbehind not implemented”.sumber
Sunting .. beri komentar Anda .. Berikut adalah skrip baru yang tidak memedulikan (mis.) William Smith. Itu sementara mengaburkan pola yang disimpan sebagai Smith (tidak berubah).
Jika Anda khawatir tentang Tn. Nyonya ... maka ini berhasil.
Anda dapat melayani William dengan menambahkan namanya ke daftar atau , misalnya.
sed -r 's/\<(William|John|...
Ini adalah naskah asli
sumber
The () akan menangkap non-Firstname sebelum LastName, sehingga mereka ditinjau kembali dalam penggantian.
Edit
@ manatwork, gilles
Kamu benar. Bagaimana tentang
Ini sepertinya berhasil.
sumber
[^John]
cocok dengan salah satu karakter yang harus menjadi salah satuJ
,o
,h
ataun
. Saya ragu ini yang Anda maksudkan. Tidak ada konstruk negasi dalam ekspresi reguler (Perl telah(?!…)
dan(?<!…)
, tetapi jika Anda menganggapnya sebagai negasi, itu mungkin tidak akan melakukan apa yang Anda harapkan).sed
tanpa itu membuat logika sed bengkak ...temp1
hampir selalu baik-baik saja, tapi! hati-hati dengan bus itu. Untuk mengurangi kemungkinan ini, saya percaya lebih baik menggunakan karakter yang (hampir) tidak pernah muncul dalam file teks Latin-Script, misalnya nilai Hex \ x01 \ x02, atau kombinasi dari mereka, atau mungkin \ xe188b4 UTF-8 lokal (ሴ - MELIHAT SINGKAT ETHIOPIC) .. mis.echo -e 'Z' |sed 's/./\xe1\x88\xb4/'
=>ሴ
ketika lokalnya adalah UTF-8 ..