Saya mencoba mengedit file nginx.conf saya secara terprogram, yang berisi baris seperti ini:
access_log /var/log/nginx/access.log;
yang saya ingin terlihat seperti ini:
access_log /dev/stdout;
Saya percaya regex ^\s*access_log([^;]*);
akan menangkap /var/log/nginx/access.log
bagian dalam grup tangkap, tapi saya tidak yakin bagaimana cara benar mengganti kelompok tangkap dengan sed?
Saya sudah mencoba
echo " access_log /var/log/nginx/access.log;" | sed 's/^\s*access_log([^;]*);/\1\\\/dev\\\/stdout/'
tapi saya mendapatkan kesalahan:
sed: -e expression #1, char 45: invalid reference \1 on `s' command's RHS
jika saya coba sed -r
maka tidak ada kesalahan, tetapi hasilnya tidak seperti yang saya harapkan:
/var/log/nginx/access.log\/dev\/stdout
Saya mencoba menjadi pintar dengan grup tangkap dan yang lainnya dan tidak mencari langsung "access_log /var/log/nginx/access.log;" dalam hal distribusi mengubah lokasi file log default.
sed '/access_log/s|/[^;]\+|/dev/stdout|'
Jawaban:
Beberapa kesalahan di sana.
Pertama, karena
sed
menggunakan ekspresi reguler dasar, Anda perlu\(
dan\)
membuat grup tangkap. The-r
beralih memungkinkan diperpanjang ekspresi reguler yang mengapa Anda tidak mendapatkan kesalahan. Lihat Mengapa saya perlu keluar dari karakter regex di sed untuk diartikan sebagai karakter regex? .Kedua, Anda menempatkan kelompok penangkap di tempat yang salah. Jika saya memahami Anda dengan benar, Anda dapat melakukan ini:
Perhatikan penggunaan
!
sebagai pembatas regex untuk menghindari keharusan melepaskan garis miring ke depan/dev/stdout
.sumber
Di regexp Anda, Anda harus tahu bahwa itu
\No.
adalah referensi kembali ke pola di dalam tanda kurung()
. Jadi regexp seharusnya's@^(\s*access_log ).*$@\1/dev/stdout/;@'
Saya bisa menawarkan
PETUNJUK: Apakah Anda bermaksud untuk menggunakan
/
di dalam patern Anda bebas untuk mengubahs///
untuk setiap simbol yang Anda inginkans###
misalnyasumber
Daripada menangkapnya, mengapa tidak mencari saja dan melakukan substitusi? Yaitu:
Ia mencari garis yang cocok dengan "
access_log
" lalu pada garis apa pun yang melakukannya akan menggantikan "/whatever/path/is/there;
" dengan "/dev/stdout;
"sumber