Bash скрипт 'sed: first RE может быть не пустым' ошибка - PullRequest
2 голосов
/ 18 февраля 2012

Я написал следующий скрипт bash, он еще не закончен, поэтому он все еще немного грязный.Сценарий ищет каталоги на том же уровне, что и сценарий, затем ищет определенный файл в каталоге, в который вносит некоторые изменения.

Когда я запускаю скрипт, он возвращает следующую ошибку:

sed: first RE may not be empty
sed: first RE may not be empty
sed: first RE may not be empty
sed: first RE may not be empty
sed: first RE may not be empty
sed: first RE may not be empty
sed: first RE may not be empty

Мое исследование говорит мне, что это может быть связано с '/' в строках имени каталога, но яНе удалось решить эту проблему.

Несмотря на сообщения об ошибках, скрипт работает нормально и корректно вносит изменения в файлы.Может кто-нибудь помочь объяснить, почему я получаю сообщение об ошибке выше?

#!/bin/bash

FIND_DIRECTORIES=$(find . -type d -maxdepth 1 -mindepth 1)
FIND_IN_DIRECTORIES=$(find $FIND_DIRECTORIES"/app/design/adminhtml" -name "login.phtml")

for i in $FIND_IN_DIRECTORIES
  do
    # Generate Random Number
    RANDOM=$[ ( $RANDOM % 1000 )  + 1 ]

    # Find the line where password is printed out on the page
    # Grep for the whole line, then remove all but the numbers
    # This will leave the old password number
    OLD_NUM_HOLDER=$(cat $i | grep "<?php echo Mage::helper('adminhtml')->__('Password: ')" )
    OLD_NUM="${OLD_NUM_HOLDER//[!0-9]}"

    # Add old and new number to the end of text string
    # Beginning text string is used so that sed can find
    # Replace old number with new number
    OLD_NUM_FULL="password\" ?><?php echo \""$OLD_NUM
    NEW_NUM_FULL="password\" ?><?php echo \""$RANDOM
    sed -ie "s/$OLD_NUM_FULL/$NEW_NUM_FULL/g" $i

    # GREP for the setNewPassword function line
    # GREP for new password that has just been set above
    SET_NEW_GREP=$(cat $i | grep "setNewPassword(" )
    NEW_NUM_GREP=$(cat $i | grep "<?php echo \"(password\" ?><?php echo" )
    NEW_NUM_GREPP="${NEW_NUM_GREP//[!0-9]}"

    # Add new password to string for sed
    # Find and replace old password for setNewPassword function
    FULL_NEW_PASS="\$user->setNewPassword(password"$NEW_NUM_GREPP")"
    sed -ie "s/$SET_NEW_GREP/$FULL_NEW_PASS/g" $i
  done

Заранее спасибо за любую помощь в этом.

ОБНОВЛЕНИЕ - ОТВЕТ

Проблема заключалась в том, что цикл for работал не так, как ожидалось.Я подумал, что он делает / first / directory "/ app / design / adminhtml", перебирает и затем делает / second / directory "/ app / design / adminhtml", а затем перебирает.На самом деле, он делал / first /, просматривая каталоги, а затем выполнял / second / directory "/ app / design / adminhtml", а затем просматривая.Таким образом, это был фактический путь к последнему элементу итерации.Я исправил проблему в сценарии ниже:

#!/bin/bash

for i in $(find . -type d -maxdepth 1 -mindepth 1); do
  FIND_IN_DIRECTORIES=$i"/app/design/adminhtml/default"
  FIND_IN_DIRECTORIES=$(find $FIND_IN_DIRECTORIES -name "login.phtml")

  # Generate Random Number
  RANDOM=$[ ( $RANDOM % 1000 ) + 1 ]

  # Find the line where password is printed out on the page
  # Grep for the whole line, then remove all but the numbers
  # This will leave the old password number
  OLD_NUM_HOLDER=$(cat $FIND_IN_DIRECTORIES | grep "<?php echo Mage::helper('adminhtml')->__('Password: ')" )
  OLD_NUM="${OLD_NUM_HOLDER//[!0-9]}"

  # Add old and new number to the end of text string
  # Beginning text string is used so that sed can find
  # Replace old number with new number
  OLD_NUM_FULL="password\" ?><?php echo \""$OLD_NUM
  NEW_NUM_FULL="password\" ?><?php echo \""$RANDOM
  sed -ie "s/$OLD_NUM_FULL/$NEW_NUM_FULL/g" $FIND_IN_DIRECTORIES

  # GREP for the setNewPassword function line
  # GREP for new password that has just been set above
  SET_NEW_GREP=$(cat $FIND_IN_DIRECTORIES | grep "setNewPassword(" )
  NEW_NUM_GREP=$(cat $FIND_IN_DIRECTORIES | grep "<?php echo \"(password\" ?><?php echo" )
  NEW_NUM_GREPP="${NEW_NUM_GREP//[!0-9]}"

  # Add new password to string for sed
  # Find and replace old password for setNewPassword function
  FULL_NEW_PASS="\$user->setNewPassword(password"$NEW_NUM_GREPP")"
  sed -ie "s/$SET_NEW_GREP/$FULL_NEW_PASS/g" $FIND_IN_DIRECTORIES
done

1 Ответ

1 голос
/ 19 февраля 2012

без отладки всей вашей установки, обратите внимание, что вы можете использовать альтернативный символ для разграничения значений sed reg-ex / match, т.е.

 sed -i "s\@$OLD_NUM_FULL@$NEW_NUM_FULL@g" $i

и

 sed -i "s\@$SET_NEW_GREP@$FULL_NEW_PASS@g" $i

Вам не нужен ключ -e, поэтому я удалил его.

Некоторым сидам требуется начальный '\' перед @, поэтому я включаю его. Возможно, что некоторые будут смущены этим, поэтому, если это не сработает, попробуйте удалить начальный '\'

Вы также должны включить отладку оболочки, чтобы точно определить, какие sed (и какие значения) вызывают проблему. Добавьте строку с set -vx в верхней части вашего скрипта, чтобы включить отладку.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...