решение для эха, чтобы заменить глобально - PullRequest
0 голосов
/ 20 декабря 2011

Как заменить echo во всех моих сценариях ksh на echo -e. Пример:

Input

Скрипт, содержащий следующие строки,

echo "\nE-MAILING TO INTERESTED PARTIES....\n"
set echo off
echo -e "\nE-MAILING TO INTERESTED PARTIES....\n"

ВЫВОД:

Мне не следует беспокоить команду set echo off и меняйте только команды печати эха. Если это уже изменено на echo -e, я не должен заменять снова. Я должен заменить его за один раз для всех сценариев из корневого каталога.

echo -e "\nE-MAILING TO INTERESTED PARTIES....\n"
set echo off
echo -e "\nE-MAILING TO INTERESTED PARTIES....\n"

Ответы [ 3 ]

1 голос
/ 20 декабря 2011
sed '/echo [^-]/s/echo/echo -e/'

Ищите echo, за которым следует пробел и что-то отличное от тире; замените echo на echo -e. Примените его в цикле к файлам, которые вы хотите изменить.

for file in *.sh
do
    sed '/echo [^-]/s/echo/echo -e/' $file > tmp.$$
    mv tmp.$$ $file
done
1 голос
/ 20 декабря 2011

Более надежным регулярным выражением будет поиск echo, за которым не следует -e или off в любом контексте: поскольку sed не может выполнять обход в регулярном выражении, вам придется использовать perl:

perl -pe 's/echo +(?!((-[A-Za-df-z]|--[a-z-]+) +)*(-e|off))/echo -e/'

Это также обрабатывает случай, который у вас может быть (например) echo -n -e, где есть a -e, но не сразу после echo: вы нехочу закончить с echo -e -n -e.Кроме того, если бы вы сказали (скажем) echo --version, вы бы не захотели echo -e --version.Вышеуказанное регулярное выражение заботится об этом.

INPUT

echo "\nE-MAILING TO INTERESTED PARTIES....\n"
set echo off
echo -e "\nE-MAILING TO INTERESTED PARTIES....\n"
echo -n -e "what happens if the -e is already there?"
echo --help # don't want echo -e --help

OUTPUT

echo -e"\nE-MAILING TO INTERESTED PARTIES....\n"
set echo off
echo -e "\nE-MAILING TO INTERESTED PARTIES....\n"
echo -n -e "what happens if the -e is already there?"
echo -e--help # don't want echo -e --help
1 голос
/ 20 декабря 2011

Это должно работать -

sed 's/^echo "/echo -e "/' filename

Тест:

[jaypal:~/Temp] cat tmp
echo "\nE-MAILING TO INTERESTED PARTIES....\n"
set echo off
echo -e "\nE-MAILING TO INTERESTED PARTIES....\n"
[jaypal:~/Temp] sed 's/^echo "/echo -e "/' tmp
echo -e "\nE-MAILING TO INTERESTED PARTIES....\n"
set echo off
echo -e "\nE-MAILING TO INTERESTED PARTIES....\n"

find и exec:

find /path/to/directory/ -type f -name "*.ksh" -exec sed -i"bak" 's/^echo "/echo -e "/' {} \;
...