gpt4 book ai didi

linux - 使用单独文件中的 sed

转载 作者:太空宇宙 更新时间:2023-11-04 05:48:54 25 4
gpt4 key购买 nike

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

基本我需要更好的方法。或者一种调用文件并将 sed 命令存储在与 bash 脚本不同的文件中的方法。还有一种只传递单个字符的方法,因此如果它是 HaloStack 中的第二个 a,则 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

最佳答案

如果我正确理解您的问题,您需要循环密码中的字符并根据某些条件更改它们。 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"
<小时/>

假设您的目标是这个简单的逻辑:更改每个字母 sb 。您可以执行以下操作:

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可能会给您带来更大的灵 active 。

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

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

关于linux - 使用单独文件中的 sed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47643858/

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