Saya menggunakan sed untuk menemukan dan mengganti pola dalam file SAS yang saya miliki daripada mengubahnya secara individual. Masalahnya adalah saya mencoba mengganti variabel makro dan ketika saya menggunakan ampersand tidak diproses dengan benar.
Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
setiap kali saya menjalankan perintah ini sepertinya menambahkan dan melakukan segala macam hal funky dengan teks asli.
Pertanyaan: Bagaimana cara mengganti teks yang berisi ampersand dengan perintah sed?
&
adalah karakter khusus sehingga harus diloloskan ketika digunakan dalam RHS - dalam kasus Anda, Anda harus menjalankan's/user=&uid./user=\&sysuserid./g'
meskipun saya menduga Anda juga perlu melarikan diri dari titik di LHS untuk mencocokkan titik literal sehingga Anda benar-benar perlu's/user=&uid\./user=\&sysuserid./g'
Jawaban:
&
khusus dalam teks pengganti: itu berarti "seluruh bagian dari input yang cocok dengan pola", jadi apa yang Anda lakukan di sini digantiuser=&uidX
denganuser=user=&uidXsysuserid.
. Untuk memasukkan ampersand yang sebenarnya dalam teks pengganti, gunakan\&
.Hal lain yang terlihat salah adalah bahwa
.
dalam pola pencarian berarti karakter apa pun (kecuali baris baru), tetapi.
pada akhir teks pengganti adalah titik literal. Jika Anda ingin mengganti hanya string literaluser=&uid.
, lindungi.
dengan backslash.Jika Anda ingin mengganti salah satu karakter dan menyimpannya dalam hasilnya, masukkan karakter ke dalam grup dan gunakan
\1
dalam pengganti untuk merujuk ke grup itu.Bahkan, mengingat pengulangan antara teks asli dan penggantian, Anda harus tetap menggunakan grup:
yaitu "ganti
u
dengansysuser
antarauser=&
danid.
".sumber
\(user=&\)
adalah pola yang cocokuser&
dan menyimpan string yang cocok sebagai grup (nomor grup 1 karena itu adalah kelompok pertama dalam pola). Kemudian dalam penggantian\1
digantikan oleh string yang disimpan untuk nomor grup 1.=
dalam ekspresi reguler dan dalam teks pengganti adalah singkatan dari dirinya sendiri, jadiuser=&
hanya cocokuser=&
, danuser=&
dalam teks pengganti menghasilkanuser=
diikuti oleh bagian dari baris yang cocok dengan regex.=
Karakter tidak memiliki arti khusus.user=&
dalam teks pengganti menghasilkanuser=
diikuti oleh teks yang cocok asli.user=\&
dalam teks pengganti menghasilkanuser=&