Mengapa saya tidak bisa memahami cara ini?

8

Saya ingin mengubah baris "disable = yes" menjadi "disable = no" menjadi file berikut:

[root@centos2 ~]# cat /etc/xinetd.d/tftp
service tftp
{
    ...
    server_args             = -s /var/lib/tftpboot
    disable                 = yes
    per_source              = 11
    ...
}  

Saya mencoba ini:

[root@centos2 ~]# grep 'disable                 = yes' /etc/xinetd.d/tftp
[root@centos2 ~]#

dengan hanya menyalin ruang dengan mouse saya tetapi tidak menangkap apa pun ...

Mengapa dan bagaimana saya bisa tahu apa saja elemen antara "disable" dan "="? Apakah ini beberapa ruang? tabulasi?

Saya tahu saya dapat melakukan grep menggunakan regex berikut:

[root@centos2 xinetd.d]# grep -E 'disable.+= yes' /etc/xinetd.d/tftp
    disable                 = yes
[root@centos2 xinetd.d]#

Dan akhirnya, apakah ada cara yang lebih baik untuk mengganti "ya" dengan "tidak" menggunakan sed daripada yang berikut:

[root@centos2 xinetd.d]# sed -r 's/disable.+= yes/disable                 = 
no/g' /etc/xinetd.d/tftp

service tftp
{
    ...
    server_args             = -s /var/lib/tftpboot
    disable                 = no
    per_source              = 11
    ...
}

EDIT:

Hasil dari perintah od terima kasih @ilkkachu

[root@centos2 xinetd.d]# < /etc/xinetd.d/tftp grep disable | od -c
0000000  \t   d   i   s   a   b   l   e
0000020                                       =       y   e   s  \n
0000037
Pozinux
sumber

Jawaban:

12

Spasi lebih umum dikenal sebagai "spasi putih", dan dapat mencakup tidak hanya spasi tetapi tab (dan karakter "kosong" lainnya). Dalam ekspresi reguler, Anda sering dapat merujuk ini dengan [[:space:]]atau \s(tergantung pada mesin RE) yang mencakup karakter horizontal (spasi, tab, dan beberapa karakter spasi unicode dengan lebar berbeda jika tersedia) yang dapat Anda gunakan [[:blank:]]dan terkadang \hdan spasi vertikal karakter (seperti umpan baris, umpan formulir, tab vertikal, atau carriage return). [[:space:]]kadang-kadang digunakan sebagai ganti [[:blank:]]untuk karakter carriage return palsu dalam file teks Microsoft.

Anda tidak dapat mengganti dengan grep- itu hanya alat pencarian. Sebagai gantinya, untuk mengganti yesdengan noAnda dapat menggunakan perintah seperti ini:

sed '/disable\>/s/\<yes\>/no/' /etc/xinetd.d/tftp

Ini memberitahu seduntuk mengganti (mengubah) kata yesmenjadi nopada baris apa pun yang berisi kata disable. (The \>(awalnya operator ex/ viregexp), dalam beberapa sedimplementasi, memaksa kata-akhir (meskipun berhati-hatilah itu bukan spasi-kata-dibatasi , itu juga akan cocok pada disable-option)). Mudahnya ini menghindari masalah ruang putih sama sekali.


Hati-hati: dengan garis seperti eyes yes, yessubstitusi tanpa batas akan berlaku untuk instance pertama yesdan meninggalkan Anda eno yes. Itu sebabnya saya menggunakan \<yes\>bukan hanya yes.

roaima
sumber
Ini dijelaskan dengan baik tetapi tidak berhasil untuk saya.
Pozinux
1
@Pozinux Saya tidak melihat bahwa Anda disabletidak berada di awal baris. Saya telah mengubah RE saya sesuai.
roaima
Masih belum ada perubahan maaf.
Pozinux
2
Anda benar, sebenarnya - saya bisa mereproduksi itu. sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'tidak bekerja untuk saya juga (pada MacOS, dengan BSD sed). Kode asli OP berfungsi dengan baik untuk saya dengan GNU sed (v4.4).
Charles Duffy
1
Akan mengatakan - bekerja dengan baik untuk saya dengandocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Charles Duffy
6

Mengapa dan bagaimana saya bisa tahu apa saja elemen antara "disable" dan "="? Apakah ini beberapa ruang? tabulasi?

Mungkin tab. Anda bisa menggunakan sesuatu seperti

< /etc/xinetd.d/tftp grep disable | od -c

untuk melihat. Ini akan menampilkan tab sebagai \t, dan spasi sebagai spasi.

ilkkachu
sumber
Tidak tahu tentang perintah, sangat bagus! Saya mengedit pertanyaan saya sehingga Anda dapat melihat hasil dari perintah od. Jika saya mengerti, tidak ada tab antara "disable" dan "=" apakah ini benar? Tetapi berapa banyak? Bisakah kita menghitungnya?
Pozinux
1
@Pozinux, jadi tidak ada tab saat itu. Saya tidak dapat melihat alasan mengapa yang pertama greptidak berhasil, maaf
ilkkachu
0

Coba alternatif grep yang disebut sift from sift-tool.org - grep pada steriod yang melakukan pencocokan pola regex cerdas

Brandon Haberfeld
sumber
Bagaimana cara kerjanya dalam situasi ini? Bisakah Anda memberi contoh?
roaima