GNU/Linux >> Belajar Linux >  >> Linux

sed pemula:mengubah semua kemunculan dalam folder

Tidak ada cara untuk melakukannya hanya dengan menggunakan sed. Anda harus menggunakan setidaknya utilitas find secara bersamaan:

find . -type f -exec sed -i.bak "s/foo/bar/g" {} \;

Perintah ini akan membuat .bak file untuk setiap file yang diubah.

Catatan:

  • -i argumen untuk sed perintah adalah ekstensi GNU, jadi, jika Anda menjalankan perintah ini dengan sed BSD Anda perlu mengalihkan output ke file baru lalu mengganti namanya.
  • find utilitas tidak mengimplementasikan -exec argumen di kotak UNIX lama, jadi, Anda perlu menggunakan | xargs sebagai gantinya.

Saya lebih suka menggunakan find | xargs cmd lebih dari find -exec karena lebih mudah diingat.

Contoh ini secara global menggantikan "foo" dengan "bar" dalam file .txt pada atau di bawah direktori Anda saat ini:

find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/foo/bar/g"

-print0 dan -0 opsi dapat diabaikan jika nama file Anda tidak mengandung karakter funky seperti spasi.


Untuk portabilitas, saya tidak mengandalkan fitur sed yang khusus untuk linux atau BSD. Sebaliknya saya menggunakan overwrite skrip dari buku Kernighan dan Pike tentang Lingkungan Pemrograman Unix.

Perintahnya kemudian

find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'

Dan overwrite skrip (yang saya gunakan di semua tempat) adalah

#!/bin/sh
# overwrite:  copy standard input to output after EOF
# (final version)

# set -x

case $# in
0|1)        echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac

file=$1; shift
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15    # clean up files

if "[email protected]" >$new               # collect input
then
    cp $file $old   # save original file
    trap 'trap "" 1 2 15; cp $old $file     # ignore signals
          rm -f $new $old; exit 1' 1 2 15   # during restore
    cp $new $file
else
    echo "overwrite: $1 failed, $file unchanged" 1>&2
    exit 1
fi
rm -f $new $old

Idenya adalah menimpa file hanya jika perintah berhasil. Berguna di find dan juga di mana Anda tidak ingin menggunakan

sed 's/old/new/g' file > file  # THIS CODE DOES NOT WORK

karena shell memotong file sebelum sed bisa membacanya.


Linux
  1. Sed:Hapus Semua Kemunculan String Kecuali Yang Pertama?

  2. Menghapus Semua Komentar C Dengan Sed?

  3. Hapus Semua File Dalam Satu Folder Kecuali Yang Terakhir (Terbaru) 20?

  1. Bagaimana Cara Menghapus Semua File Dengan Ekstensi Tertentu Di Folder Tertentu?

  2. Tampilkan Semua Baris Sebelum Pertandingan?

  3. Cara Mengganti Semua Kemunculan Word di Semua File di Baris Perintah Linux

  1. Chmod 777 ke folder dan semua isinya

  2. Bagaimana mengubah semua kemunculan kata di semua file dalam direktori

  3. sed ganti semua tab dan spasi dengan satu spasi