perintah sed dalam konsol berfungsi; tetapi dalam skrip shell ia melempar kesalahan

1

Saya mencoba untuk menulis skrip shell untuk mengganti string SEARCH dengan string REPLACE di semua file direktori saat ini (direktori di mana skrip saya tetap).

Syarat yang saya miliki adalah: skrip harus mengganti 'string pencarian' menjadi 'ganti string' di semua file kecuali skrip shell saya.

Saya mencoba sed perintah di konsol. Itu bekerja seperti yang saya harapkan. Tetapi ketika saya menambahkan perintah sed ini ke skrip saya, itu melempar kesalahan.

Perintah dalam skrip saya (replace.sh) adalah:

search_str=is;
replace_str=IS;
sed -i.bak s/$search_str/$replace_str/g !(replace.sh)

Kesalahan yang saya dapatkan adalah:

./replace.sh: line 11: syntax error near unexpected token '('
./replace.sh: line 11: 'sed -i.bak s/$search_str/$replace_str/g !(replace.sh)'

Semoga Anda bisa membantu saya .. Terima kasih sebelumnya ..

SILVIYA
sumber
temukan. -nama " . " | xargs sed -i "s /
search_Text
Aktifkan shop extglob dengan shopt -s extglobskrip Anda.
Hastur

Jawaban:

0

Anda hanya perlu mengaktifkanextglob skrip, setidaknya di titik itu.

#!/bin/bash
search_str=is                  # Variable Initialization 
replace_str=IS
                               # Other stuffs other 7 lines in your script
Old_State=$(shopt -p extglob)  # Here you save the value of shopt extglob

shopt -s extglob               # Here you change (if needed) that value
sed -i.bak s/$search_str/$replace_str/g !(replace.sh)

$Old_State                     # Here you restore the previous value of extglob
                               # Other code ...    

Saya sarankan Anda untuk menyimpan dan mengembalikan status extglob kalau-kalau skripnya panjang dan ada perintah lain yang memerlukan status opsi itu ... Tentu saja jika Anda menulis skrip Anda sendiri, Anda dapat memutuskan untuk menulisnya dengan extglob diaktifkan dan konsisten dengannya: jadi Anda hanya perlu menambahkan shopt -s extglobskrip sebelum baris itu (# 11).

Info lebih lanjut dengan help shoptdari shell.

Cepat
sumber
1

Ini karena pola yang diperluas suka !(replace.sh)tidak diaktifkan. Tambahkan shopt -s extglobke skrip Anda.

glenn jackman
sumber
0

setelah bekerja sedikit dalam masalah Anda saya pikir saya mungkin punya solusinya

#!/bin/bash

search_str=is;
replace_str=IS;
find .  -maxdepth 1 -type f ! -wholename $0 -exec sed -i s@$search_str@$replace_str@g {} \;

Saya telah menggunakan find dengan -maxdepth 1 top mendapatkan perubahan sed diterapkan ke semua file dalam folder di mana skrip berada. ! -merekam $ 0 membuat skrip menghindari digunakan pada dirinya sendiri

Salam

Jesus Cepeda
sumber
1
Catatan: "! -Wholename $ 0 membuat skrip menghindari digunakan dengan sendirinya" itu berfungsi saat Anda melakukannya chmod u+xpada skrip Anda dan Anda menjalankannya dengan ./replace.shtetapi itu akan gagal jika Anda menjalankan skrip Anda dengan /bin/bash replace.sh. PS> Kamu lupa menulis ekstensi di -i.bakopsi, itu bisa berguna;)
Hastur