Saya ingin menambahkan teks ke file suka echo "abc" >>file.txt
.
Tapi ini tambahkan abc
setelah baris baru
Bagaimana saya bisa menambahkan abc
di akhir file dengan gema tanpa baris baru?
shell
text-processing
io-redirection
echo
choijj
sumber
sumber
abc
tanpa baris baru akhir, yang (setelah membaca pertanyaan Anda dengan penuh perhatian) tampaknya tidak seperti yang Anda inginkan.Jawaban:
echo "abc" >>file.txt
menempatkan baris baru setelahnyaabc
, bukan sebelumnya. Jika Anda berakhir denganabc
barisnya sendiri, itu berarti baris baru sebelumnyaabc
sudah ada difile.txt
.Perhatikan bahwa sangat normal bagi file teks untuk mengakhiri baris baru. Pada unix, baris terdiri dari urutan karakter selain null⁰ atau baris baru diikuti oleh baris baru. 1 Oleh karena itu file teks yang tidak kosong diakhiri dengan karakter baris baru.
Jika Anda ingin menambahkan teks ke baris terakhir file, maka Anda tidak dapat melakukannya dengan
>>
, karena ini selalu ditambahkan ke file, jadi selalu menulis setelah baris baru terakhir. Sebagai gantinya Anda membutuhkan alat yang mampu memodifikasi file yang ada. Misalnya, Anda dapat menggunakan sed :Dalam perintah sed, yang pertama
$
berarti "lakukan perintah berikut hanya di baris terakhir", perintah itus/REGEX/REPLACEMENT/
menggantikan REGEX dengan REPLACEMENT, dan persamaan reguler$
cocok di akhir baris.Perintah sed Linux memiliki fitur bawaan untuk mengotomatiskan urutan buat-file-dan-ganti baru ini, sehingga Anda dapat mempersingkatnya menjadi
⁰ Itu byte nol, yang panggilan ASCII NUL dan panggilan Unicode U + 0000. Program pemrosesan teks mungkin atau mungkin tidak mengatasi karakter ini.
1 Lihat definisi File Teks , Baris , dan Karakter Baris Baru di bagian "Definisi" pada bab Definisi Dasar dari IEEE 1003.1-2008: 2016.
sumber
0x41
(ASCII'A'
), secara teknis tidak lagi file teks? Jika demikian, saya sarankan menekankan hal itu karena itu semacam definisi yang tidak intuitif; jika tidak, sedikit perubahan pada kata-kata dapat membantu menghindari kebingungan.Saya tidak berpikir itu mungkin dengan
echo
perintah, gunakansed
pendekatan berikut sebagai gantinya:-i
- memodifikasi file inplace$
- menunjukkan catatan / baris terakhirs/$/abc/
- gantikan akhir baris$
dengan substringabc
(untuk catatan terakhir)sumber
date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
Dengan asumsi bahwa file tersebut belum berakhir di baris baru dan Anda hanya ingin menambahkan beberapa teks tanpa menambahkannya, Anda dapat menggunakan
-n
argumen, misalnyaNamun, beberapa sistem UNIX tidak menyediakan opsi ini; jika itu yang dapat Anda gunakan
printf
, mis(
%s
argumen awal adalah untuk menjaga terhadap teks tambahan yang%
memformat karakter di dalamnya)Dari
man echo
(di macOS High Sierra):sumber
echo -n
tidak akan menempatkan baris baru di akhirabc
, tetapiabc
masih akan didahului oleh baris baru, yang ingin dihindari oleh pengguna.\n
tidak muncul di tempat pertama. Lebih banyak opsi lebih baik, terutama ketika mereka tidak perlu menulis ulang seluruh file setiap kali terjadi perubahan (yang bisa agak lambat dan berjalan dalam waktu polinomial jika dilakukan berulang kali).Jika Anda memiliki
truncate
perintah dan file teks Anda memiliki NL sebagai karakter terakhir, Anda dapat menghapusnya dan kemudian menambahkan teks Anda seperti ini:(Perhatikan bahwa
truncate
tidak ada yang peduli dengan konten file, dan dalam contoh ini cukup kurangi ukuran file dengan satu byte. Jika karakter terakhir Anda bukan satu byte, yaitu karakter multi-byte "lebar" maka Anda akan memperkenalkan korupsi.)sumber
Yang Anda inginkan adalah menambahkannya di akhir baris terakhir, jadi sebelum pembatas baris terakhir, jadi tepat sebelum karakter terakhir file.
Dengan
ksh93
, Anda dapat melakukan:Di mana
1<>
operator standar untuk membuka file dalam mode baca + tulis (dan yang lebih penting tanpa pemotongan ) pada stdout dan>#((...))
merupakan operator pencarian khusus ksh93 (di sini untuk mencari sebelum byte terakhir). Catatan yangecho
menulis diabc<newline>
manaa
menimpa baris baru yang ada di sana danecho
menambahkan baris baru sendiri.The
zsh
setara:Meskipun untuk padanan yang lebih tepat, Anda juga perlu mencetak pesan kesalahan saat gagal mencari:
sumber
Mungkin UUOC tetapi Anda juga bisa melakukan:
Seperti yang ditunjukkan Gilles, perintah ini terbatas:
Selain itu berhati-hatilah dalam menggunakan
cat
file yang tidak Anda kenal:Kesimpulan :
Gunakan sed
sumber
echo
: pcat
, tetapi untuk masalah dengan urutan pelarian sewenang-wenang yang dikirim ke terminal.