Saya sangat bingung dengan berbagai pilihan GNU sed
, POSIX sed
, dan BSD sed
. Bagaimana cara mengganti literal \n
dengan karakter baris baru menggunakan tiga sed
jenis ini?
foo\\nbar
atau foo\\\nbar
?
Saya sangat bingung dengan berbagai pilihan GNU sed
, POSIX sed
, dan BSD sed
. Bagaimana cara mengganti literal \n
dengan karakter baris baru menggunakan tiga sed
jenis ini?
foo\\nbar
atau foo\\\nbar
?
Jawaban:
sed 's/\\n/\
/g'
Perhatikan garis miring terbalik tepat sebelum memukul balik dalam string pengganti.
sed
perintah asli di Unix v7 pada tahun 1979. Satu-satunya tempat di mana yang mungkin tidak akan berfungsi adalah implementasi stripped-down non-POSIX sed
seperti beberapa yang berbasis-kotak-sibuk busybox-based. Itu tidak akan bekerja di csh tapi ini masalah csh.
\\n
digunakan di bagian pencarian, mengapa tidak digunakan \n
dalam penggantian? yang pertama tampaknya menyiratkan yang terakhir ada. yaitu. kenapa tidak ini$ echo '1\n2'|sed 's/\\n/\n/g'
\n
adalah literal, menyiratkan bahwa itu muncul sebagai dua karakter: abackslash diikuti oleh n
, dan bukan sebagai karakter baris baru. Oleh karena itu, dua backslash untuk membuat backslash menjadi harfiah dan kemudiann
Karena Anda sudah memiliki sed
jawaban portabel Anda , saya hanya akan menyebutkan bahwa sed
jarang ada alat terbaik jika Anda perlu memanipulasi baris baru. Perl sangat mudah dibawa-bawa sed
, diinstal secara default pada kebanyakan sistem * nix dan dapat menangani hal ini dengan sangat mudah:
printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'
Pilihan lain yang sangat portabel adalah awk
:
printf '%s\n' 'aa\nbb' | awk '{gsub("\\\\n","\n")};1'
Pada Solaris, ingatlah untuk menggunakan awk standar di / usr / xpg4 / bin, yang di / bin adalah yang historis dan tidak boleh digunakan untuk skrip baru.
awk
memiliki masalah portabilitas yang sama (Apakah saya sudah awk
tua awk
, nawk
atau gawk
?). Sebenarnya, versi dalam kotak Solaris saya kurang gsub()
. Pilihan saya di sini adalah untuk Perl ( perl -nlawe '...'
mendekati perilaku otomatis awk
).
awk
portabilitas, tetap menggunakan versi awk
yang sesuai dengan POSIX dan hanya menggunakan fitur-fitur itu dan Anda harus baik-baik saja. Pada Solaris Anda akan menemukan satu sebagai /usr/xpg4/bin/awk
.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?
gsub()
harus bekerja di mana-mana. Bahkan busybox memiliki awk
.
Jika H
oldspace kosong Anda juga dapat melakukan:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... tetapi jawaban uxnut sudah lebih cepat dan lebih sederhana, sehingga Anda dapat menerimanya sesuka Anda.
Kemungkinan asing lainnya:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
Tapi waspadalah, ^ yang menerjemahkan semua lompatan \
backslash C-style standar - seperti \b
ackspace, \r
eturn, \00
oktal, dan apa pun yang Anda miliki.
Dengan gnu sed
yang berikut ini juga berfungsi:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Anda memerlukan solusi dalam sed, dan itu sudah diberikan di bawah ini. Tapi saya ingin menambahkan kemungkinan lain bahwa IMHO lebih mudah dan lebih cepat,
tr -d "\n"