1

Я пытаюсь написать сценарий оболочки, чтобы заменить строку ПОИСК на строку ЗАМЕНИТЬ во всех файлах текущего каталога (каталог, где мой сценарий остается).

У меня есть условие: сценарий должен заменить «строку поиска» на «заменить строку» во всех файлах, кроме моего сценария оболочки.

Я попробовал команду sed в консоли. Это сработало, как я и ожидал. Но когда я добавил эту команду sed в мой скрипт, он выдает ошибку.

Команда в моем скрипте (replace.sh):

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

Я получаю ошибку:

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

Надеюсь, вы можете помочь мне .. Заранее спасибо..

3 ответа3

1

Это потому что расширенные шаблоны, как !(replace.sh) не включен. Добавьте shopt -s extglob в ваш скрипт.

0

поработав немного над вашей проблемой, я думаю, у меня может быть решение

#!/bin/bash

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

Я использовал find с -maxdepth 1 top, чтобы изменения sed применялись ко всем файлам в папке, где находится скрипт. ! -wholename $ 0 позволяет избежать использования самого сценария

С уважением

0

Вам просто нужно включить extglob в скрипте, по крайней мере, в этой точке.

#!/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 ...    

Я предлагаю вам сохранить и восстановить состояние extglob на тот случай, если скрипт длинный и у него есть какая-то другая команда, которой нужен этот статус опции ... Конечно, если вы пишете свой собственный скрипт, вы можете написать его с включенным extglob и быть в соответствии с ним: так что вам нужно только добавить shopt -s extglob в скрипт перед этой строкой (# 11).

Больше информации с help shopt из оболочки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .