GNU/Linux >> Belajar Linux >  >> Ubuntu

Beberapa File Teks Ganti Dengan Sed?

Saya mencoba mengganti beberapa teks dalam file teks dengan sed tetapi tidak tahu bagaimana melakukannya dengan banyak file.
Saya menggunakan:

sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g /path/to/file/target_text_file

Sebelum saya pergi dengan banyak file, saya mencetak jalur file teks yang ditargetkan dalam file teks dengan perintah ini:

find /path/to/files/ -name "target_text_file" > /home/user/Desktop/target_files_list.txt

Sekarang saya ingin menjalankan sed sesuai dengan target_files_list.txt .

Jawaban yang Diterima:

Anda dapat mengulang file menggunakan while ... do lingkaran:

$ while read i; do printf "Current line: %s\n" "$i"; done < target_files_list.txt

Dalam kasus Anda, Anda harus mengganti printf ... dengan sed perintah yang Anda inginkan.

$ while read i; do sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' "$i"; done < target_files_list.txt

Namun, perhatikan bahwa Anda dapat mencapai apa yang Anda inginkan hanya dengan menggunakan find :

$ find /path/to/files/ -name "target_text_file" -exec sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' {} \;

Anda dapat membaca lebih lanjut tentang -exec opsi dengan menjalankan man find | less '+/-exec ' :

   -exec command ;

          Execute command; true if 0 status is returned.  All
          following arguments to find are taken to be arguments to
          the command until an argument consisting of `;' is
          encountered.  The string `{}' is replaced by the current
          file name being processed everywhere it occurs in the
          arguments to the command, not just in arguments where it
          is alone, as in some versions of find.  Both of these
          constructions might need to be escaped (with a `\') or
          quoted to protect them from expansion by the shell.  See
          the EXAMPLES section for examples of the use of the
          -exec option.  The specified command is run once for
          each matched file.  The command is executed in the
          starting directory.  There are unavoidable security
          problems surrounding use of the -exec action; you should
          use the -execdir option instead.

EDIT:

Seperti yang dicatat dengan benar oleh pengguna terdon dan makanan penutup di komentar
perlu menggunakan -r dengan read karena itu akan dengan benar
menangani garis miring terbalik. Ini juga dilaporkan oleh shellcheck :

$ cat << EOF >> do.sh
#!/usr/bin/env sh
while read i; do printf "$i\n"; done < target_files_list.txt
EOF
$ ~/.cabal/bin/shellcheck do.sh

In do.sh line 2:
while read i; do printf "\n"; done < target_files_list.txt
      ^-- SC2162: read without -r will mangle backslashes.

Jadi seharusnya:

$ while read -r i; do sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' "$i"; done < target_files_list.txt

Ubuntu
  1. Menggunakan beberapa pola sekaligus dengan perintah Sed

  2. Bagaimana Cara Mengganti String Dalam File?

  3. Bagaimana Cara Menggunakan Sed Atau Ex Untuk Mengganti Blok (Kode multi-baris) Dengan Blok Teks (kode) Baru?

  1. Ganti kutipan pintar dengan perintah sed Linux

  2. Bagaimana cara mengganti file di jar dengan baris perintah di linux?

  3. SED ganti di beberapa baris

  1. Memanipulasi teks pada baris perintah dengan sed

  2. Ganti Baris Baru Dengan Nul?

  3. sed Contoh Perintah di Linux