Bagaimana cara menyisipkan teks sebelum baris pertama file?

76

Saya telah melihat-lihat sedperintah untuk menambahkan teks ke file di baris tertentu. Ini berfungsi menambahkan teks setelah baris 1:

sed '1 a\

Tapi saya ingin menambahkannya sebelum baris 1. Yaitu:

sed '0 a\

tapi saya mendapatkan error ini: invalid usage of line address 0.

Ada saran?

Manolo
sumber
stackoverflow.com/questions/15157659/…
Léo Léopold Hertz 준영

Jawaban:

101

Gunakan opsi sedsisipkan ( i) yang akan menyisipkan teks pada baris sebelumnya.

sed '1 i\

Pertanyaan pembaruan penulis:

Untuk membuatnya mengedit file di tempat - dengan GNU sed- saya harus menambahkan -iopsi:

sed -i '1 i\anything' file

Juga sintaks

sed  -i '1i text' filename

Untuk non-GNU sed

Anda harus menekan tombol kembali segera setelah garis miring terbalik 1i\dan setelah first_line_text:

sed -i '1i\
first_line_text
'

Perhatikan juga bahwa beberapa sedimplementasi non-GNU (misalnya yang ada di macOS) memerlukan argumen untuk -iflag (gunakan -i ''untuk mendapatkan efek yang sama seperti dengan GNU sed).

tersangka
sumber
1
Itu tidak bekerja tanpa -iopsi. Saya akan memperbarui jawaban Anda sebelum menerima.
Manolo
1
Terima kasih. OS apa yang Anda gunakan? Solusi orisinal bekerja pada OpenSuse 9.
tersangka
1
Menarik! Saya di Lubuntu 13.10 dan sed '1 i\this text is entered above the existing first line' filebekerja untuk saya.
2
Di sini, menggunakan sed (GNU sed) 4.2.2hanya sed '1 i text to insert' -i filebekerja seperti pesona. Terima kasih
ton
1
@FeRD Lihat awkjawaban peringkat saya yang buruk di bawah ini. Ini seharusnya bekerja.
rudimeier
18

Echo digunakan untuk mendapatkan teks. Nama file Cat - mencetak file di konsol dan> menggunakannya untuk mengirim ke nama file lain1 dan kemudian kami memindahkan namafile1 ke namafile untuk memasukkan teks ke baris pertama dari file yang diinginkan.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename
Ankit Shah
sumber
7
Tolong beri tahu saya mengapa yang berikut ini diturunkan
Ankit Shah
1
Mungkin karena OP menyebutkan sed. Menurut saya itu tidak layak untuk dinilai. Solusi itu bahkan yang terbaik yang sesuai dengan kebutuhan saya, kemudian ditingkatkan.
рüффп
Saya terbalik. bekerja pada ksh untukku.
arcee123
16

Anda dapat menggunakan Vim dalam mode Ex:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 pilih baris pertama

  2. i masukkan teks dan baris baru

  3. x Simpan dan tutup

Steven Penny
sumber
7

Anda ingin memasukkan teks sebelum baris pertama daripada menambahkannya setelah itu, jadi gunakan

sed '1 i\
your_text' your_file

Dokumen di sini juga dapat membantu:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
Joseph R.
sumber
6

Menggunakan GNU awk> = 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

Berlawanan dengan semua sedjawaban, ini juga berfungsi pada file kosong.

rudimeier
sumber
inplaceadalah perpustakaan, dan sayangnya itu muncul di semua distribusi awk kirimkan. Saya mendapatkan "awk: fatal: tidak dapat membuka file sumber 'inplace' untuk membaca"GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
vossad01
6
sed  -i '1i new_text' file_name

Jika Anda tidak menentukan -iopsi, itu tidak akan menampilkan kesalahan, dan menampilkan output pada terminal standar, tetapi tidak memasukkan teks ke dalam file.

devi.
sumber
Pertanyaannya bukan tentang -isaklar.
don_crissti
bagaimana kamu mengetahuinya? Itu adalah jawaban untuk pertanyaan itu. Ya, ini mirip dengan jawaban yang diterima, tetapi tidak persis sama.
G-Man
@ G-Man - orang mungkin berpendapat template yang digunakan oleh cas jauh dari ideal tapi sungguh, ini mirip seperti di hampir identik ... perbedaannya adalah jarak dan fakta yang satu ini tidak memiliki garis miring terbalik. Sejauh yang saya ketahui mereka secara teknis identik (karena keduanya gnu sedspesifik dan kebetulan yang gnu sedakan menerima itanpa backslash). Jika orang lain berpikir ini menjamin jawaban yang terpisah + jawaban ... oh well.
don_crissti
2

The 0aperintah Anda berusaha tidak bekerja di ex, pendahulu kevi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

The printfperintah dengan sendirinya output:

0a
Anything you want to add
.
x

Cara 0amenambahkan setelah baris 0 (yaitu sebelum baris pertama).

Baris berikutnya atau beberapa baris adalah teks literal yang akan ditambahkan.

Pada .baris dengan sendirinya mengakhiri perintah "append".

The xpenyebab Ex untuk menyimpan perubahan ke file dan keluar.

Wildcard
sumber
1

Saya terkejut bahwa dalam pertanyaan lama ini tidak ada yang menunjukkan perintah sed yang paling umum (dan cukup sederhana dalam hal ini):

$ sed  -i '1s/^/new_text\
/' file_name

Yang bekerja di sebagian besar shell dan portabel untuk beberapa versi sed.
Jika GNU sed tersedia, Anda dapat menggunakan ini:

$ sed -i '1s/^/new_text\n' file_name

Perbedaannya adalah bahwa sed GNU memungkinkan penggunaan a \nuntuk baris baru dan yang lain membutuhkan baris baru secara literal yang didahului oleh garis miring terbalik (yang juga tetap berfungsi pada GNU sed).

Jika shell yang menerima $'…'sintaks sedang digunakan, Anda dapat menyisipkan baris baru secara langsung, jadi lihatlah bahwa baris baru sudah ada di sana:

$ sed -i $'1s/^/new_text\\\n/' file_name

Yang berfungsi untuk lebih banyak versi sed.

Ishak
sumber
-1

Sayangnya, semua jawaban di atas (sebagian besar dengan sed) tidak berhasil karena saya semua mengganti baris pertama. Saya menggunakan Ubuntu 16.04 LTSmesin. Berikut adalah solusi saya GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name
Splinter479
sumber
1
Tidak yakin apa yang Anda bicarakan ... Hanya ada satu sedjawaban yang menggunakan penggantian tetapi tidak menggantikan baris yang ada.
don_crissti
-1

Pertama dan terakhir

Saya akan berasumsi bahwa siapa pun yang mencari cara memasukkan / menambahkan teks ke awal / akhir file mungkin juga perlu tahu bagaimana melakukan yang lain juga.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Penjelasan

Ini adalah caloutput yang disalurkan ke gnu- sed(dipanggil gsedpada macOS diinstal melalui brew.sh ) dengan diperpanjang RegEx ( -E) dan 6 "skrip" diterapkan ( -e) dan jeda baris lolos \untuk dibaca. Skrip 1 & 2 digunakan 1i\untuk "pada baris 1, masukkan". Skrip 5 & 6 digunakan $a\untuk "di baris <last>, tambahkan". Saya secara vertikal menyelaraskan output teks untuk membuat kode mewakili apa yang diharapkan dalam hasilnya. Skrip 3 & 4 melakukan pergantian (yang terakhir hanya berlaku untuk "baris <last>"). Hasilnya adalah mengonversi output perintah ke JSON yang valid.

keluaran

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}
Bruno Bronosky
sumber
Meskipun saya belum memberikan suara untuk pertanyaan Anda, perhatikan bahwa kami sudah memiliki beberapa jawaban, termasuk jawaban yang diterima, yang menunjukkan hasil yang diinginkan.
Jeff Schaller
@JeffSchaller Komunitas Stack Exchange bukan forum. Tujuannya melampaui membantu OP agar tidak terblokir. Tujuannya adalah untuk menanamkan basis pengetahuan global dengan banyak opsi yang dapat ditemukan para pencari ketika mencari jawaban. Alasan saya memberi judul jawaban saya adalah untuk membantu pengguna mengenali kegunaan jawaban ini bahkan sebelum mereka mengklik hasil Google.
Bruno Bronosky
Apa yang saya katakan adalah bahwa jawaban Anda tidak memberikan apa yang baru pilihan (jawaban) bagi pembaca masa depan pertanyaan ini. Kami sudah memiliki empat jawaban yang menggunakan variasi 1iuntuk memasukkan teks sebelum baris pertama. Seseorang dengan pertanyaan ini harus mengekstrak bagian yang mereka butuhkan dari jawaban Anda untuk menyelesaikan masalah mereka. Pertanyaan gratis, jadi saya mengundang Anda untuk bertanya & menjawab pertanyaan Anda sendiri untuk memberikan jawaban spesifik Anda.
Jeff Schaller