Bagaimana cara menambahkan teks ke awal dan akhir beberapa file teks di Bash?

24

Saya memiliki direktori yang penuh dengan file teks. Tujuan saya adalah menambahkan teks ke awal dan akhir dari semuanya. Teks yang muncul di awal dan akhir sama untuk setiap file.

Berdasarkan kode yang saya dapatkan dari web, ini adalah kode untuk menambahkan ke awal file:

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

Ini adalah kode untuk menambahkan ke akhir file. Tujuannya adalah untuk menambahkan teks };di akhir setiap file:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

Contoh yang saya ambil adalah untuk bertindak pada file individual. Saya pikir saya akan mencoba bertindak pada banyak file menggunakan wildcard *.txt,.

Saya mungkin akan membuat kesalahan lain juga. Bagaimana pun, bagaimana cara menambahkan teks ke awal dan akhir beberapa file?

Penanya
sumber

Jawaban:

27

Untuk menambahkan teks ke file yang dapat Anda gunakan (dengan implementasi GNU sed):

sed -i '1i some string' file

Menambahkan teks sesederhana

echo 'Some other string' >> file

Hal terakhir yang harus dilakukan adalah memasukkannya ke dalam loop yang beralih ke semua file yang ingin Anda edit:

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done
Marco
sumber
8

Anda dapat menggunakan sed GNU

Seperti telah diilustrasikan, Anda dapat menyisipkan baris teks tepat sebelum dan setelah mencocokkan baris file dengan sed, menggunakan perintah idan amasing-masing. Apa yang belum ditampilkan adalah Anda dapat melakukannya dengan satu-liner dan untuk beberapa file sekaligus.

Berikut ini akan menyisipkan baris sebelum yang pertama 1idan setelah baris terakhir $a. Sisipan akan dieksekusi untuk semua file yang cocok dengan glob *.txt.

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

Keduanya idan atidak hanya bekerja dengan nomor baris, tetapi juga pada setiap baris yang cocok dengan pola yang diberikan. Ini akan menyisipkan komentar setiap kali sebuah baris berisi var y = 2;:

sed -i -- '/var y = 2;/i//initialize variable y' *.js
J. Katzwinkel
sumber
5

Perintah Sepenuhnya POSIX, menggunakan ex:

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

Jika Anda menjalankan printfbagian dari perintah itu sendiri, Anda akan melihat perintah pengeditan yang tepat untuknya ex:

0a
var language = {
.
$a
};
.
x

0aberarti "Tambahkan teks setelah baris 0" (dengan kata lain, sebelum baris pertama). Baris berikutnya adalah teks literal untuk "ditambahkan" setelah baris 0. Periode ( .) pada baris dengan sendirinya mengakhiri teks yang akan ditambahkan.

$a berarti menambahkan teks setelah baris terakhir file.

x artinya menyimpan perubahan dan keluar.

Wildcard
sumber
2

Berikut cara untuk melakukannya di Perl:

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done
terdon
sumber
@ StéphaneChazelas menambahkan -ialih-alih penggantian file ini tidak berfungsi, hanya mencetak ke stdout.
Oleh Prypin
@ OlehPrypin, memang itu hak Anda. Komentar dihapus.
Stéphane Chazelas
1

Coba gunakan ex:

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

di mana perintah:

  • bufdo!mengeksekusi perintah di bawah ini untuk setiap buffer / file yang dibuka (catatan: ini bukan POSIX )
  • 1s/^/HEAD/- menyisipkan HEADteks ke dalam baris pertama di awal baris
  • $s/$/TAIL/- menambahkan TAILteks pada baris terakhir di akhir baris

dan argumennya adalah:

  • -s - mode diam / cepat
  • -cxa - simpan semua buffer / file yang dibuka dan keluar
  • *.foo- semua file dalam direktori saat ini ( *) dengan fooekstensi, penggunaan **/*.foountuk recursivity (setelah mengaktifkan globstar: shopt -s globstar)
kenorb
sumber
1
note bufdo bukan POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
1
@ SevenPenny benar. Saya hanya menggunakan fitur yang ditentukan POSIX, secara pribadi, untuk pengeditan skrip.
Wildcard
1

Dengan gnu awk, menggunakan inplaceekstensi dan BEGINFILE/ ENDFILE:

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt
don_crissti
sumber
1

Juga berhak menjadi (dengan hasil dalam .outfile):

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

Varian lain - file sumber yang lebih rumit diganti dengan hasil:

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print
benteng
sumber
0

Perl one-liner untuk menyelamatkan:

perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
Kjetil S.
sumber