gpt4 book ai didi

Bash 脚本 'sed: first RE may not be empty' 错误

转载 作者:行者123 更新时间:2023-12-03 20:18:31 44 4
gpt4 key购买 nike

我已经写了下面的 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/directory 循环,然后执行/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

最佳答案

无需调试整个设置,请注意,您可以使用备用字符来分隔 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 需要在 @ 之前使用前导“\”,因此我将其包含在内。有些人可能会对此感到困惑,所以如果这不起作用,请尝试删除前导的 '\'

您还应该打开 shell 调试,以准确查看导致问题的 sed(以及哪些值)。添加一行 set -vx在脚本顶部附近打开调试。

我希望这有帮助。

关于Bash 脚本 'sed: first RE may not be empty' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9343692/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com