从单独的文件中使用sed

时间:2017-12-04 23:48:59

标签: linux bash shell sed

我有一个项目,我必须使用随机数来更改密码。如果数字低于给定值,则更改该字母。如果它更高,则字母保持不变。我的问题是我在查找有关使用其他文件中的sed更改信件的信息时遇到问题。现在这不是必需的,但我觉得在我看来会更清洁。现在我的问题是如何从我的bash脚本调用该文件,该文件将使用sed替换一个字母。我只是认为在我的脚本中粘贴26个sed命令有点多,我可以把它放在一个单独的文件中。如果你知道一个更好的方法。

基本的我需要更好的方法。或者一种调用文件并将sed命令存储在bash脚本的单独文件中的方法。并且只传递一个字符的方法,所以如果它是HaloStack中的第二个字符,则sec命令不会更改第一个字符,因为它可能已经被更改了。

以下是我所拥有的。我正在研究sed脚本。但我不知道如何只发送一个字符来改变它。

#!/bin/bash

#FUNCTIONS
##Random word grabber
passwdget () {
wget -qO- http://creativitygames.net/random-word-generator/randomwords/$wordamount | grep -o 'randomword_[1-9]\">[a-z]*' | awk -F ">" '{print $2}' > test.txt
}

#parses the words from one file
oneline () {
paste -s test.txt | sed 's/[[:blank:]]//g' > testnospace.txt
rm test.txt
mv testnospace.txt test.txt
}

passwdrnd () {
# Declare array
passwdstr=$(cat test.txt)
}

#VARIABLES
wordamount=4
complexity=0.0

#GET OPTIONS
while getopts ":n:t:" opt; do
    case ${opt} in
        n ) wordamount="$OPTARG";;
        t ) complexity="$OPTARG";;
        \?) ;;#invalad option
        : ) ;;#missing arguments for an option
    esac
done

#MAIN PROGRAM
passwdget
oneline
passwdrnd
echo $passwdstr

exit 0

#Use next information for getting a random number between 0.0 - 1.0
#awk -v seed=$RANDOM 'BEGIN{srand(seed);print rand()}'


#Get position echo ${var:position:length}

需要以不同方式更改的示例单词列表。

pimplefrogsoapchimp

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您需要循环密码中的字符并根据某些条件进行更改。 sed可能不是一个好的解决方案。

有很多方法可以迭代字符串中的字符。仅使用Bash:

pass="somepassword"

for (( i=0; i < ${#pass}; i++ )); do
    char=${pass:$i:1}
    echo "$char"
    #some magic with chars here 
done
while IFS= read -r -d '' -n 1 char; do
    echo "$char"
    #some magic with chars here
done <<< "$pass"

使用awk

awk '{
   split($0, chars, "")
   for ( i=1; i <= length($0); i++ )
   {
      print chars[i]
      #do some magic with chars here
   }
}' <<< "$pass"
awk 'BEGIN { FS="" } 
{
   for ( i=1; i <= NF; i++ )
   {
      print $i
      #some magic with chars here (i = char)
   }
}' <<< "$pass"

让我们说你的目标是这个简单的逻辑:将每个字母s更改为b。您可以执行以下操作:

for (( i=0; i < ${#pass}; i++ )); do
   char=${pass:$i:1}
   if [[ $char = "s" ]]; then
      newpass="${newpass}b"
   else
      newpass="${newpass}${char}"
   fi
done

使用sed 's/s/b/g' <<< "$pass"可以轻松完成此简单示例。但是通过循环遍历所有字符,您可以执行更复杂的逻辑/计算。使用awk可能会为您提供更大的灵活性。

编辑:如果您只想将每个字符映射到不同的输出,请使用关联数组来映射它们。映射三个字符abc

pass="abba"
declare -A map=( [a]="cc" [b]="ff" [c]="rr" )

for (( i=0; i < ${#pass}; i++ )); do
        char=${pass:$i:1}
        newpass="${newpass}${map[$char]}"
done

#newpass is now: ccffffcc

答案 1 :(得分:0)

我不确定我是否正确理解了这个问题,但如果是这样,这似乎有效:

#!/bin/bash

#FUNCTIONS
##Random word grabber
passwdget () {
wget -qO- http://creativitygames.net/random-word-generator/randomwords/$wordamount | grep -o 'randomword_[1-9]\">[a-z]*' | awk -F ">" '{print $2}' > tes$
}

#parses the words from one file
oneline () {
paste -s test.txt | sed 's/[[:blank:]]//g' > testnospace.txt
rm test.txt
mv testnospace.txt test.txt
}



passwdrnd () {
# Declare array
randchar=255;
passwdstr=$(cat test.txt)
randnum=$(dd if=/dev/urandom count=1 bs=1 2>/dev/null| od -a -i | head -n 2 | tail -n 1 | awk '{print $1}')
chars="abcdefghijklmnopqrstuvwxyz";
if [ $randnum -ge 127 ]; then
randchar=255;
while [ $randchar -ge 27 ]; do
randchar=$(dd if=/dev/urandom count=1 bs=1 2>/dev/null| od -a -i | head -n 2 | tail -n 1 | awk '{print $1}')
done;
onechar=`echo $chars | cut -c $randchar`
fi;
#if [ $randnum -le 127 ]; then
#false;
#fi;
}

#VARIABLES
wordamount=4
complexity=0.0

#GET OPTIONS
while getopts ":n:t:" opt; do
    case ${opt} in
        n ) wordamount="$OPTARG";;
        t ) complexity="$OPTARG";;
        \?) ;;#invalad option
        : ) ;;#missing arguments for an option
    esac
done

#MAIN PROGRAM
passwdget
oneline
passwdrnd
#echo $passwdstr
echo $passwdstr
spacing=500;
while [ $spacing -ge `echo $passwdstr | wc -c` ]; do
spacing=$(dd if=/dev/urandom count=1 bs=1 2>/dev/null| od -a -i | head -n 2 | tail -n 1 | awk '{print $1}')
done;
other=`expr $spacing - 2`
fpart=`echo $passwdstr | cut -c -$other`
spart=`echo $passwdstr | cut -c $spacing-`;
echo $fpart$onechar$spart

exit 0

#Use next information for getting a random number between 0.0 - 1.0
#awk -v seed=$RANDOM 'BEGIN{srand(seed);print rand()}'

如果0到255之间的随机返回高于或低于127,它将使用一些随机从wget中取出一个字符并更改其中一个字符;然后它会将第一部分放在另一个变量的可变字符,随机字符中,第二部分放在第三个变量中并打印出来。