Bagaimana saya bisa mengganti spasi dengan baris baru pada input seperti:
/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5
dll ...
Untuk mendapatkan yang berikut ini:
/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5
Catatan
Saya memposting pertanyaan ini untuk membantu pengguna lain, tidak mudah untuk menemukan jawaban yang berguna di UNIX SE sampai saya mulai mengetik pertanyaan ini. Setelah itu saya menemukan yang berikut:
Pertanyaan terkait
Bagaimana saya bisa menemukan dan mengganti dengan baris baru?
bash
text-processing
string
laconbass
sumber
sumber
Jawaban:
Gunakan
tr
perintahDitemukan di http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
sumber
tr
!Dalam hal ini saya akan menggunakan printf:
Jika ada spasi di dalam salah satu jalur, Anda dapat mengutip filepath untuk mencegahnya terpecah pada spasi:
Untuk mengubah teks secara umum,
tr
adalah taruhan terbaik Anda, seperti tercakup dalam jawaban yang ada.sumber
Dengan asumsi Anda memiliki string dengan spasi sebagai pemisah:
Namun Anda mungkin mengajukan pertanyaan yang salah. (Tidak harus, misalnya ini mungkin muncul dalam makefile.) Daftar nama file yang dipisahkan spasi tidak benar-benar berfungsi: bagaimana jika salah satu nama file berisi spasi?
Jika suatu program menerima nama file sebagai argumen, jangan bergabung dengan spasi. Gunakan
"$@"
untuk mengaksesnya satu per satu. Meskipunecho "$@"
mencetak argumen dengan spasi di antaranya, itu karenaecho
: ia mencetak argumennya dengan spasi sebagai pemisah.somecommand "$@"
meneruskan nama file sebagai argumen terpisah ke perintah. Jika Anda ingin mencetak argumen pada baris yang berbeda, Anda dapat menggunakanJika Anda memiliki nama file yang dipisahkan oleh ruang dan Anda ingin meletakkannya dalam array untuk mengatasinya, Anda dapat menggunakan ekspansi variabel yang tidak dikutip untuk membagi nilai pada karakter
IFS
(Anda harus menonaktifkan ekspansi wildcard denganset -f
, jika tidak, pola akan diperluas nilainya):Anda bisa merangkum ini dalam fungsi yang mengembalikan
-f
pengaturan dan nilaiIFS
ketika selesai:sumber
set -f
danIFS
di manual bash jika Anda ingin semua detailnya. Lihat juga unix.stackexchange.com/questions/16192/...IFS
lokal tidak berlakuBersikap pragmatis, gunakan sed !!
Kata di atas mengatakan untuk mengganti satu atau lebih karakter spasi putih (\ s +) dengan baris baru (\ n)
Ini kurang lebih:
sumber
Sebagai alternatif
tr
dari @laconbass, Anda juga dapat menggunakanxargs
dalam hal ini:Keuntungannya adalah ia bekerja bahkan dengan banyak spasi putih, yang
tr
tidak.sumber
Inilah cara saya melakukannya:
Perhatikan penggunaan tombol Enter setelah backslash dalam
sed
perintah.sumber
sed
berakhirtr
?sed
karena merupakan editor daripada hanya menerjemahkan karakter.sed
dapat melakukan lebih banyak lagi, tetapi benar-benar berlebihan untuk ini.tr
adalah alat yang tepat untuk pekerjaan INI, tetapi pengetahuansed
dan regex tentu akan berguna nanti!Pendekatan lain, dengan asumsi baris dalam variabel yang disebut
line
:Ini memanfaatkan fakta bahwa Bash membagi argumennya pada spasi putih secara default dan
echo
menambahkan baris baru ke inputnya secara default.sumber
adalah metode lain untuk mengubah kata-kata yang dipisahkan satu spasi menjadi baris yang dipisahkan.
sumber
Skrip berikut mudah dimengerti dan mudah digunakan.
sumber
tr
) sama dengan jawaban yang diterima. Selain itu jawaban Anda memiliki masalah berikut: a) perintah tidak diindentasi dengan 4 spasi (-> tata letak markdown) b) Penggunaan Andacat
tidak berguna (Anda dapat menggantinya dengan< filename tr ' ' '\n'
). c) Nama file keluaran Anda sama dengan nama file input. Dengan itu Anda membuat perlombaan data.