Menggunakan alat baris perintah umum seperti sed atau awk, apakah mungkin untuk bergabung dengan semua baris yang diakhiri dengan karakter yang diberikan, seperti backslash?
Misalnya, diberikan file:
foo bar \
bash \
baz
dude \
happy
Saya ingin mendapatkan hasil ini:
foo bar bash baz
dude happy
text-processing
awk
sed
perl
Cory Klein
sumber
sumber
cpp
:)sed
FAQJawaban:
solusi sed yang lebih pendek dan sederhana:
atau satu-liner jika menggunakan GNU
sed
:sumber
sed
:) ... Anda menambahkan setiap baris langsung ke pola-ruang, dan ketika garis "biasanya berakhir" muncul, maka seluruh ruang pola jatuh dan cetakan otomatis (karena tidak ada opsi -n) ... rapi! .. +1sed -e :a -e '/\\$/N; s/\\\n//; ta'
Ini mungkin termudah dengan perl (karena perl seperti sed dan awk, saya harap ini dapat diterima oleh Anda):
sumber
Inilah solusi awk. Jika garis berakhir dengan
\
, potong garis miring terbalik dan cetak garis tanpa mengakhiri baris baru; jika tidak, cetak baris dengan baris baru yang berhenti.Ini juga tidak terlalu buruk di sed, meskipun awk jelas lebih mudah dibaca.
sumber
Ini bukan jawaban. Ini adalah masalah sampingan tentang
sed
.Secara khusus, saya perlu mengambil
sed
perintah Gilles terpisah satu demi satu untuk memahaminya ... Saya mulai menulis beberapa catatan di atasnya, dan kemudian berpikir itu mungkin berguna di sini untuk seseorang ...jadi ini dia ... Script sed Gilles dalam format yang terdokumentasi :
sumber
Namun alat baris perintah umum lainnya adalah
ed
, yang secara default memodifikasi file di tempat dan karenanya membiarkan izin file tidak dimodifikasi (untuk informasi lebih lanjut tentanged
melihat Mengedit file dengan editor teks ed dari skrip )sumber
Menggunakan fakta bahwa
read
di shell akan mengartikan garis miring terbalik ketika digunakan tanpa-r
:Perhatikan bahwa ini juga akan menafsirkan backslash lain dalam data.
sumber
a\\b\\\\\\\\\\\c
Solusi sederhana (r) yang memuat seluruh file dalam memori:
Atau yang masih pendek yang berfungsi memahami baris (keluaran) (sintaksis GNU):
Pada satu baris (sintaks POSIX):
Atau gunakan awk (jika file terlalu besar untuk muat di memori):
sumber
Versi Mac berdasarkan solusi @Giles akan terlihat seperti ini
Di mana perbedaan utama adalah bagaimana baris baru diwakili, dan menggabungkan lebih jauh ke dalam satu baris memecahnya
sumber
Anda dapat menggunakan cpp, tetapi menghasilkan beberapa baris kosong di mana ia menggabungkan output, dan beberapa pengantar yang saya hapus dengan sed - mungkin itu dapat dilakukan dengan cpp-flags dan opsi juga:
sumber
cpp
adalah solusi? Dalam contoh Anda,echo
string dengan tanda kutip ganda sudah menampilkan teks yang diluruskan, jadicpp
tidak ada gunanya. (Ini juga berlaku untuksed
kode Anda .) Jika Anda menempatkan string dalam tanda kutip tunggal,cpp
cukup hapus garis miring terbalik tetapi tidak menyatukan garis. (Rangkaian dengancpp
akan bekerja jika tidak ada ruang sebelum backslash, tetapi kemudian kata-kata yang terpisah akan bergabung tanpa pemisah.)cpp
seperti itu masih belum menyatukan garis bagi saya. Dan penggunaansed
jelas tidak perlu. Gunakancpp -P
: “-P
Menghambat pembuatan linemarker pada output dari preprocessor.” - man cppcpp: “-P: No such file or directory cpp: warning: '-x c' after last input file has no effect cpp: unrecognized option '-P:' cpp: no input files
Acpp --version
mengungkapkancpp (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
- apa? Ubuntu sedang menambal cpp? Mengapa? Saya akan diharapkan untuk membaca GNU ...cpp
memang menyatukan baris dan meninggalkan beberapa kekosongan. Yang lebih menarik, versi yang sama 4.4.3-4ubuntu5.1 di sini menerima-P
. Namun itu hanya menghilangkan tanda garis, garis kosong tetap ada.