Saya memiliki perintah penggantian sed yang saya ingin kompatibel dengan BSD sed
serta GNU sed
. Ekspresi reguler yang diperluas bukan masalah karena saya tidak membutuhkannya dalam kasus ini. Masalah utama saya adalah perbedaan dalam cara kedua sed
karakter menafsirkan urutan pelarian dalam string pengganti . String pengganti saya berisi tab dan baris baru dan saya ingin agar terlihat di string perintah untuk kemudahan pemeliharaan, namun, BSD sed
tidak menafsirkan urutan pelarian dan GNU sed
melakukannya . Apa cara yang tepat untuk menginstruksikan sed
untuk menafsirkan urutan melarikan diri ini pada BSD? Dua snippet berikut melambangkan masalah saya:
GNU sed
echo ABC | sed 's/B/\n\tB\n'
yeilds
A
B
C
BSD sed
echo ABC | sed 's/B\n\tB\n'
hasil panen
AntBnC
Jelas, \n
dan \t
tidak ditafsirkan sebagai urutan pelarian oleh BSDsed
Sekarang, untuk pertanyaan saya. Menurut sed
manual BSD :
Untuk menentukan karakter baris baru dalam string pengganti, awali dengan garis miring terbalik.
Apakah ini menyiratkan bahwa saya harus mendahului baris baru literal dengan garis miring terbalik? Apa cara yang tepat untuk menginstruksikan sed
untuk menafsirkan urutan melarikan diri seperti \n
dalam teks pengganti?
sed
. Pada akhirnya mungkin masuk akal untuk menggunakan awk. Jadi apa yang Anda pikirkan tentang interpretasi dari sed sedpage BSD yang saya kutip?Jawaban:
Jika Anda perlu menulis skrip portabel, Anda harus tetap menggunakan fitur-fitur dalam standar POSIX (alias Single Unix alias Open Group Base Specification). Edisi 7 alias POSIX-1.2008 adalah yang terbaru, tetapi banyak sistem belum selesai mengadopsinya. Edisi 6 alias POSIX-1.2001 pada umumnya disediakan oleh semua kesatuan modern.
dalam sed , makna urutan escape seperti
\t
dan\n
tidak portabel, kecuali bahwa dalam regex ,\n
singkatan baris baru. Dalam teks pengganti untuk sebuahs
perintah,\n
tidak portabel, tetapi Anda dapat menggunakan urutan backslash-newline untuk berdiri untuk baris baru.Cara portabel untuk menghasilkan karakter tab (atau karakter lain yang dinyatakan dalam oktal) adalah dengan
tr
. Simpan karakter dalam variabel shell dan gantikan variabel ini dalam potongan sed.Perhatikan lagi bahwa baris baru harus diekspresikan secara berbeda dalam regex dan dalam
s
teks pengganti.Anda mungkin ingin menggunakan awk sebagai gantinya. Ini memungkinkan lolos backslash, termasuk lolos oktal
\ooo
, di setiap string literal.sumber
Anda dapat menggunakan bash
$'...'
kutipan untuk menafsirkan lolos sebelum meneruskan stringsed
.Dari halaman bash man:
sumber
Ini telah dijawab pada Stack Overflow:
/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed
Ini persis seperti yang dikatakan jw013.
Untuk memasukkan tipe tab literal ctrl+ VTab.
sumber