Jika saya menjalankan perintah cat file | grep pattern
, saya mendapatkan banyak garis keluaran. Bagaimana Anda menggabungkan semua garis menjadi satu baris, secara efektif mengganti masing "\n"
- masing dengan "\" "
(diakhiri dengan "
diikuti oleh spasi)?
cat file | grep pattern | xargs sed s/\n/ /g
tidak bekerja untuk saya.
sed
skrip Anda dalam tanda kutip tunggal sehingga Bash tidak mengacaukannya (karenased s/\n/ /g
panggilansed
dengan dua argumen, yaitus/n/
dan/g
); (2) karena Anda ingin outputcat file | grep pattern
menjadi masukan untuksed
, bukan argumen untuksed
, Anda perlu menghilangkanxargs
; dan (3) tidak perlu untuk dicat
sini, karenagrep
dapat menggunakan nama file sebagai argumen kedua. Jadi, Anda harus mencobagrep pattern file | sed 's/\n/ /g'
. (Dalam hal ini itu tidak akan berhasil, untuk alasan yang diberikan pada tautan di atas, tetapi sekarang Anda tahu untuk masa depan.)Jawaban:
Gunakan
tr '\n' ' '
untuk menerjemahkan semua karakter baris baru ke spasi:Catatan:
grep
membaca file,cat
menggabungkan file. Jangancat file | grep
!Edit:
tr
hanya dapat menangani terjemahan karakter tunggal. Anda dapat menggunakanawk
untuk mengubah pemisah rekaman keluaran seperti:Ini akan mengubah:
untuk:
sumber
echo ""
di akhir untuk menambahkan baris baru sebelum teks prompt."
, itu terlihat sepertione" two" three"
, namun saya ingin itu muncul sepertione" two" three
. Perhatikan tiga terakhir tidak memiliki tanda kurung. Ada ide?sed '$s/..$//'
untuk menghapus 2 karakter terakhir di baris terakhir.--delete
opsi karena default mengharapkan dua argumen. mistr --delete '\n'
.Piping output to
xargs
akan menyatukan setiap baris output ke satu baris dengan spasi:Atau perintah apa pun, mis.
ls | xargs
. Batasxargs
keluaran standar adalah ~ 4096 karakter, tetapi dapat ditingkatkan dengan mis.xargs -s 8192
.grep xargs
sumber
| tr '\n' ' '
tidak bekerja untuk saya ketika dipanggil melaluiphp exec
fungsi. Itu mengabaikan tr, dan hanya memberikan pertandingan terakhir dari grep.| xargs
bekerja.Di bash
echo
tanpa tanda kutip, hapus carriage return, tab, dan beberapa spasisumber
IFS="$(printf '\n\t')"
echo $(<file)
... menggunakan gema tidak hanya lebih rapi daripada menggunakantr '\n' ' '
, tetapi juga lebih baik (pikirkan\r\n
akhir baris). @aggsol, Anda bisa mengatakanIFS=$'\n\t'
Ini bisa menjadi apa yang Anda inginkan
Mengenai hasil edit Anda, saya tidak yakin apa artinya, mungkin ini?
(ini mengasumsikan bahwa
~
tidak terjadi difile
)sumber
cat file
itu benar-benar akancat
, atau bahkan file. (Saya baru saja membiarkan bagian itu tidak berubah karena tidak relevan dengan pertanyaan)Ini adalah contoh yang menghasilkan keluaran terpisah dengan koma. Anda dapat mengganti koma dengan pemisah apa pun yang Anda butuhkan.
menghasilkan:
sumber
Berikut adalah metode menggunakan
ex
editor (bagian dari Vim ):J oin semua lini dan p etak ke output standar:
Hanya semua baris di tempat (dalam file):
Catatan: Ini akan menggabungkan semua baris di dalam file itu sendiri!
sumber
Cara tercepat dan termudah yang saya tahu untuk mengatasi masalah ini:
Saat kami ingin mengganti karakter baris baru
\n
dengan spasi :xargs
memiliki batas sendiri pada jumlah karakter per baris dan jumlah semua karakter yang digabungkan, tetapi kita dapat meningkatkannya. Detail dapat ditemukan dengan menjalankan perintah ini:xargs --show-limits
dan tentu saja dalam manual:man xargs
Saat kami ingin mengganti satu karakter dengan yang lainnya tepat satu karakter :
Saat kami ingin mengganti satu karakter dengan banyak karakter :
Pertama, kami mengganti karakter baris baru
\n
untuk tildes~
(atau memilih karakter unik lain yang tidak ada dalam teks), dan kemudian kami mengganti karakter tilde dengan karakter lain (many_characters
) dan kami melakukannya untuk setiap tilde (benderag
).sumber
Mungkin cara terbaik untuk melakukannya adalah menggunakan alat 'awk' yang akan menghasilkan output menjadi satu baris
Ini akan menggabungkan semua garis menjadi satu dengan pembatas ruang
sumber
{print}
karena ini adalah tindakan standar awk.Berikut adalah metode sederhana lain menggunakan
awk
:Juga, jika file Anda memiliki kolom, ini memberikan cara mudah untuk menggabungkan hanya kolom tertentu:
sumber
Di red hat linux saya hanya menggunakan echo:
echo $ (cat / some / file / name)
Ini memberi saya semua catatan file hanya pada satu baris.
sumber