string select并追加到另一个字符串

时间:2013-01-01 11:26:09

标签: linux bash

我有一个文件(FreshPIN.txt),每行包含大量的密码;我需要一个bash脚本来选择其中一个引脚,将其打印出来,然后将其从源文件中删除,将其添加到另一个文件的末尾(usedPIN.txt)。

FreshpPIN.txt就像:

========
1111111111111111
2222222222222222
3333333333333333
....
nnnnnnnnnnnnnnnn
========

在打印之前,我应该被要求输入0到31之间的数字并将数字放在下面的命令中:

at&g**00**=xtd*788*1111111111111111#
上面示例中的

at&g=xtd*788*应该在所有输出命令中都是稳定的。

2 个答案:

答案 0 :(得分:0)

fresh=FreshPIN.txt
used=usedPin.txt
echo "Please key in"
read key
pin=`head -1 "$fresh"`
printf '%s\n' "$pin" >>"$used"
sed -i~ 1d "$fresh"
printf 'at&g%s=xtd*788*%s\n' "$key" "$pin"

答案 1 :(得分:0)

这个怎么样?

#!/bin/bash

fresh=FreshpPIN.txt
used=usedPIN.txt
max=31

die() {
    echo >&2 "$@"
    exit 1
}

# Get a random pin
pin=$(sed -n '/[[:digit:]]\+/p' -- "$fresh" | shuf -n1)
[[ "$pin" ]] || die "No more pins in file \`$fresh'"

echo "Pin chosen: $pin"

# Prompt user:
while read -e -r -p "Enter a number between 0 and $max (q to quit): " n; do
   if [[ "$n" = q ]]; then
       echo "Aborting. Pin $pin remains in file \`$fresh'."
       exit 0
   elif [[ "$n" != +([[:digit:]]) ]]; then
      echo "Not a valid number. Try again."
   elif ((10#$n>max)); then
      echo "Number must be between 0 and $max. Try again."
   else
      break
   fi
done

# Guard if read fails (e.g., if user presses Ctrl-D)
[[ "$n" ]] || die "Something went wrong."

# Delete this pin from file
ed -s -- "$fresh" <<EOF
/^$pin\$/d
wq
EOF

# Save pin in file
printf >> "$used" "%s\n" "$pin"

# Output:
printf "at&g**%02d**=xtd*788*%s\n" "$((10#$n))" "$pin"

它非常强大(用户必须真正输入0到31之间的数字,如果用户输入,例如09),它就不会被搞砸。使用ed删除文件FreshpPIN.txt中的旧引脚:效率非常高(没有使用sed -i的辅助文件或丑陋的东西)。整体上使用良好的bash练习。使用shuf得到一个随机引脚(不需要计算行数并破解丑陋的东西以获得随机引脚)。 sed用于仅选择文件FreshpPIN.txt中的图钉,因此您可以将标题,评论等留在那里。