Dengan standar sed, Anda tidak akan pernah melihat baris baru dalam teks yang dibaca dari file. Ini karena sedmembaca baris demi baris, dan karena itu tidak ada baris baru di akhir teks dari baris saat ini dalam sedruang pola. Dengan kata lain, sedmembaca data yang dibatasi baris baru, dan pembatas bukanlah bagian dari apa yang seddilihat skrip.
Ekspresi reguler dapat ditambatkan di akhir baris menggunakan $(atau di awal, menggunakan ^). Mengaitkan suatu ekspresi pada awal / akhir suatu garis memaksanya untuk mencocokkan dengan tepat di sana, dan tidak hanya di mana saja pada garis tersebut.
Jika Anda ingin mengganti apa pun yang cocok dengan pola [A-Za-z]*di akhir baris dengan sesuatu, maka jangkar pola seperti ini:
[A-Za-z]*$
... akan memaksanya untuk mencocokkan di akhir baris dan di tempat lain.
Namun, karena [A-Za-z]*$juga tidak cocok dengan apa pun (misalnya, string kosong hadir di akhir setiap baris), Anda perlu memaksakan pencocokan sesuatu , misalnya dengan menentukan
[A-Za-z][A-Za-z]*$
atau
[A-Za-z]\{1,\}$
Jadi, baris perintah sed Anda akan demikian
$ sed 's/[A-Za-z]\{1,\}$/replace/' file.txt
Saya tidak menggunakan -Esakelar di sini karena itu tidak diperlukan. Dengan itu, Anda bisa menulis
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt
Atau, jalan panjang yang tidak perlu:
Saya sudah tahu, ini bisa dilakukan, masih menggunakan sed, dengan bantuan tr. Anda dapat menetapkan karakter lain untuk mewakili akhir baris. Karakter sementara lain harus digunakan, dalam hal ini "` ". Mari kita gunakan "~" untuk mewakili akhir dari baris:
Tidak yakin saya mengerti ... Mengapa Anda tidak berlabuh ke ujung barisan $? miss/[a-zA-Z]*$/replace/
don_crissti
1
2 poin: 1) Anda sebaiknya menggunakan \+daripada *yang terakhir memungkinkan nol huruf pada akhir string; 2) Anda dapat menggunakan kelas karakter [[:alpha:]]. Jadi:sed 's/[[:alpha:]]\+$/replace/' file
glenn jackman
@glennjackman Untuk apa backslash sebelum plus? Bukankah itu cocok dengan karakter tambahan?
Dari cuplikan kode (rusak) yang Anda poskan, sepertinya Anda juga ingin mengganti baris baru. Jika demikian, regex anchoring dengan sendirinya tidak dapat membantu Anda. Berikut ini adalah solusinya:
sed '/[[:alpha:]]\+$/{N;s/[[:alpha:]]\+\n/replace/}' your_file
Rusak:
/[a-zA-Z]\+$/{} berarti menerapkan apa pun yang ada di dalam ikal ke garis yang cocok dengan regex.
Di dalam ikal, Nberarti "tambahkan baris berikutnya ke buffer aktif" (apa yang seddisebut 'ruang pola')
Akhirnya s///pernyataan itu adalah pengganti Anda. Sekarang berfungsi karena ruang pola berisi dua garis berturut-turut dan baris baru karenanya merupakan bagian darinya.
Atau, jalan panjang yang tidak perlu:
sumber
$
? miss/[a-zA-Z]*$/replace/
\+
daripada*
yang terakhir memungkinkan nol huruf pada akhir string; 2) Anda dapat menggunakan kelas karakter[[:alpha:]]
. Jadi:sed 's/[[:alpha:]]\+$/replace/' file
-r
opsi menggunakan sintaks ekspresi reguler ini .Dari cuplikan kode (rusak) yang Anda poskan, sepertinya Anda juga ingin mengganti baris baru. Jika demikian, regex anchoring dengan sendirinya tidak dapat membantu Anda. Berikut ini adalah solusinya:
Rusak:
/[a-zA-Z]\+$/{}
berarti menerapkan apa pun yang ada di dalam ikal ke garis yang cocok dengan regex.N
berarti "tambahkan baris berikutnya ke buffer aktif" (apa yangsed
disebut 'ruang pola')s///
pernyataan itu adalah pengganti Anda. Sekarang berfungsi karena ruang pola berisi dua garis berturut-turut dan baris baru karenanya merupakan bagian darinya.sumber
Untuk menemukan akhir baris, cukup gunakan tanda-$ :
Tanpa ujung jangkar:
Tanpa ujung jangkar:
sumber