shell 整理(26)===大小写字母替换和随机取出一个奇数
2017-09-25 10:48
357 查看
(一)题目: 接受一个输入,如果是大写字母换成小写字母,小写字母换成大写字母。
例如:
[root@localhost hushuai]# bash 4.sh
input:dinGXUE
DINgxue
[root@localhost hushuai]#
方法(1)
shell 代码如下:
#!/bin/bash
read -p "input:" dd
echo $dd | tr '[a-z][A-Z]' '[A-Z][a-z]'
~
方法(2)
shell 代码如下:
#!/bin/bash
read -p "input word:" word
[ -z $word ] && echo "\033[32m input word!!! \033[0m"
a=${#word}
for i in `seq $a`
do
b=`echo $word | cut -c$i`
c=`echo $b |tr 'a-z' '1'`
if [ "$c" = 1 ];then
e=`echo $b |tr 'a-z' 'A-Z'`
else
e=`echo $b |tr 'A-Z' 'a-z'`
fi
echo -n $e
done
echo
******但是前面着两种方法也都存在各自的局限,例如:
[root@localhost hushuai]# bash 3.sh
input word:ding XUE
3.sh: line 4: [: ding: binary operator expected #报错;是因为我中间多了一个空格
DINGxue
[root@localhost hushuai]# bash 3.sh
input word:dingXUE #这样输入就完全没问题
DINGxue
[root@localhost hushuai]#
这时候我们可以拓宽一下思路,如果我们把题目改掉
(1)允许用户输入的是任意字符,包括空格
(2)如果不是字母,就返回输入的值,不做任何改变
(3)如果是大写字母换成小写,小写换成大写
例如:
[root@localhost hushuai]# bash 7.sh
Plz Input Something:diNG %s js
DIng %S JS
[root@localhost hushuai]#
*************非常好的一个思路
shell 代码如下:
!/bin/bash
swap() {
a=`echo $1 | grep -c '[a-z]'` #传进来的参数能不能过滤到[a-z]任意一个
b=`echo $1| grep -c '[A-Z]'` 字母,肯定在一行,所以a和b 的值不是0
if [ $a -eq 1 ];then 就是1
echo -n $1 | tr 'a-z' 'A-Z'
elif [ $b -eq 1 ];then #在循环里面每执行一次换一个行
echo -n $1 | tr 'A-Z' 'a-z' -n 保证在循环中不
else 换行
echo -n "$1"
fi
}
read -p "Plz Input Something:" string
for i in `seq ${#string}` #输入字符串的个数,包括空格
do
xxoo=`echo $string |cut -c $i`
swap "$xxoo" #必须加双引号,不然空格不解析,细节问题
done
echo
题目(二):一个简单随机数的应用
执行脚本后从1-100个数里面,随机弹出一个奇数。
shell 脚本代码如下:
#!/bin/bash
for i in `seq 100`
do
if [ $((i%2)) -ne 0 ];then
echo $i >>123
fi
done
a=`cat 123 |wc -l`
b=$((RANDOM%$a+1))
cat 123 | sed -n ''$b'p'
这个原理非常的简单,看到这个以后我们也可以做成一个点名册,点名册里面有很多学生的名字排成一列,例如执行一个脚本,就随机性弹出一个名字。
我对上面脚本的总结,个人心得:
(1)tr 替换问题:
[root@localhost hushuai]# echo ABCdSDdsff | tr '[a-zA-Z]' '[A-Za-z]'
abcDsdDSFF
[root@localhost hushuai]#
这么写也可以,但是你一定要注意位置,而且不加中括号也可以,例如
[root@localhost hushuai]# echo ABCdSDdsff | tr 'a-zA-Z' 'A-Za-z'
abcDsdDSFF
[root@localhost hushuai]#
但是不能这么写,这么写就傻逼了。。。。。。
[root@localhost hushuai]# echo ABCdSDdsff | tr 'A-Za-z' 'A-Za-z'
ABCdSDdsff
[root@localhost hushuai]#
还有就是如果要替换的不够了,会出现什么情况呢,就会用最后一个数或字母补齐==例如:
[root@localhost hushuai]# echo {a..z} | tr 'a-z' '0-9'
0 1 2 3 4 5 6 7 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
tr 还有经常用的选项就是 tr -s 压缩 tr -d 删除
例如:看出效果了吗?就把空格全都给删除了
[root@localhost hushuai]# echo 123 456 | tr -d ' '
123456
[root@localhost hushuai]# echo 123 456 | tr -d ' 6' #删除空格和6
12345
[root@localhost hushuai]# echo 123 456 | tr -d '6' #只删除6不删除空格
123 45
[root@localhost hushuai]# echo 123 456 | tr -d '[ 6]' #也可以这么写
12345
[root@localhost hushuai]#
例如:这样,如果文本中有多行呢?
【root@localhost hushuai]# cat 000
123 qwd
456 dsj
[root@localhost hushuai]# cat 000 | cut -c-10 | tr -d ' ' #把每一行的空格删除,所以说
123qwd 删除是针对每一行行内来说的
456dsj
[root@localhost hushuai]#
tr -s 是针对一行到另一行来说的
例如:
[root@localhost hushuai]# cat 000
123 qwd
#这有一个空行
o
456 dsj
[root@localhost hushuai]# cat 000 | cut -c-10 | tr -d ' '|tr -s '\n'
123qwd tr -d :把每一行空格全删掉,但是每一行都有换行
o 符,以换行符为单位压缩
456dsj
[root@localhost hushuai]#
利用这个我们可以取出本机内的网卡的名称:例如
[root@localhost hushuai]# ifconfig |cut -c-10 | tr -d ' ' |tr -s '\n'
eth0
eth1
lo
[root@localhost hushuai]#
(3)grep -c grep是一行一行读取的,统计过滤到了多少行,不是多少个
例如:
[root@localhost hushuai]# echo 123 | grep -c '[0-9]'
1
[root@localhost hushuai]# echo 123 | grep -c '0-9' #必须加单引号中括号,和单引号
0
[root@localhost hushuai]# echo 123 | grep '[0-9]'
123
[root@localhost hushuai]# echo 123 | grep -o '[0-9]' #这样我们就能看出[0-9]表示
1 匹配任意一个中括号里面的字母。
2 [^0-9]这样表示取反
3 ^[0-9]以0-9中任意一个字母开头
例如:
[root@localhost hushuai]# bash 4.sh
input:dinGXUE
DINgxue
[root@localhost hushuai]#
方法(1)
shell 代码如下:
#!/bin/bash
read -p "input:" dd
echo $dd | tr '[a-z][A-Z]' '[A-Z][a-z]'
~
方法(2)
shell 代码如下:
#!/bin/bash
read -p "input word:" word
[ -z $word ] && echo "\033[32m input word!!! \033[0m"
a=${#word}
for i in `seq $a`
do
b=`echo $word | cut -c$i`
c=`echo $b |tr 'a-z' '1'`
if [ "$c" = 1 ];then
e=`echo $b |tr 'a-z' 'A-Z'`
else
e=`echo $b |tr 'A-Z' 'a-z'`
fi
echo -n $e
done
echo
******但是前面着两种方法也都存在各自的局限,例如:
[root@localhost hushuai]# bash 3.sh
input word:ding XUE
3.sh: line 4: [: ding: binary operator expected #报错;是因为我中间多了一个空格
DINGxue
[root@localhost hushuai]# bash 3.sh
input word:dingXUE #这样输入就完全没问题
DINGxue
[root@localhost hushuai]#
这时候我们可以拓宽一下思路,如果我们把题目改掉
(1)允许用户输入的是任意字符,包括空格
(2)如果不是字母,就返回输入的值,不做任何改变
(3)如果是大写字母换成小写,小写换成大写
例如:
[root@localhost hushuai]# bash 7.sh
Plz Input Something:diNG %s js
DIng %S JS
[root@localhost hushuai]#
*************非常好的一个思路
shell 代码如下:
!/bin/bash
swap() {
a=`echo $1 | grep -c '[a-z]'` #传进来的参数能不能过滤到[a-z]任意一个
b=`echo $1| grep -c '[A-Z]'` 字母,肯定在一行,所以a和b 的值不是0
if [ $a -eq 1 ];then 就是1
echo -n $1 | tr 'a-z' 'A-Z'
elif [ $b -eq 1 ];then #在循环里面每执行一次换一个行
echo -n $1 | tr 'A-Z' 'a-z' -n 保证在循环中不
else 换行
echo -n "$1"
fi
}
read -p "Plz Input Something:" string
for i in `seq ${#string}` #输入字符串的个数,包括空格
do
xxoo=`echo $string |cut -c $i`
swap "$xxoo" #必须加双引号,不然空格不解析,细节问题
done
echo
题目(二):一个简单随机数的应用
执行脚本后从1-100个数里面,随机弹出一个奇数。
shell 脚本代码如下:
#!/bin/bash
for i in `seq 100`
do
if [ $((i%2)) -ne 0 ];then
echo $i >>123
fi
done
a=`cat 123 |wc -l`
b=$((RANDOM%$a+1))
cat 123 | sed -n ''$b'p'
这个原理非常的简单,看到这个以后我们也可以做成一个点名册,点名册里面有很多学生的名字排成一列,例如执行一个脚本,就随机性弹出一个名字。
我对上面脚本的总结,个人心得:
(1)tr 替换问题:
[root@localhost hushuai]# echo ABCdSDdsff | tr '[a-zA-Z]' '[A-Za-z]'
abcDsdDSFF
[root@localhost hushuai]#
这么写也可以,但是你一定要注意位置,而且不加中括号也可以,例如
[root@localhost hushuai]# echo ABCdSDdsff | tr 'a-zA-Z' 'A-Za-z'
abcDsdDSFF
[root@localhost hushuai]#
但是不能这么写,这么写就傻逼了。。。。。。
[root@localhost hushuai]# echo ABCdSDdsff | tr 'A-Za-z' 'A-Za-z'
ABCdSDdsff
[root@localhost hushuai]#
还有就是如果要替换的不够了,会出现什么情况呢,就会用最后一个数或字母补齐==例如:
[root@localhost hushuai]# echo {a..z} | tr 'a-z' '0-9'
0 1 2 3 4 5 6 7 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
tr 还有经常用的选项就是 tr -s 压缩 tr -d 删除
例如:看出效果了吗?就把空格全都给删除了
[root@localhost hushuai]# echo 123 456 | tr -d ' '
123456
[root@localhost hushuai]# echo 123 456 | tr -d ' 6' #删除空格和6
12345
[root@localhost hushuai]# echo 123 456 | tr -d '6' #只删除6不删除空格
123 45
[root@localhost hushuai]# echo 123 456 | tr -d '[ 6]' #也可以这么写
12345
[root@localhost hushuai]#
例如:这样,如果文本中有多行呢?
【root@localhost hushuai]# cat 000
123 qwd
456 dsj
[root@localhost hushuai]# cat 000 | cut -c-10 | tr -d ' ' #把每一行的空格删除,所以说
123qwd 删除是针对每一行行内来说的
456dsj
[root@localhost hushuai]#
tr -s 是针对一行到另一行来说的
例如:
[root@localhost hushuai]# cat 000
123 qwd
#这有一个空行
o
456 dsj
[root@localhost hushuai]# cat 000 | cut -c-10 | tr -d ' '|tr -s '\n'
123qwd tr -d :把每一行空格全删掉,但是每一行都有换行
o 符,以换行符为单位压缩
456dsj
[root@localhost hushuai]#
利用这个我们可以取出本机内的网卡的名称:例如
[root@localhost hushuai]# ifconfig |cut -c-10 | tr -d ' ' |tr -s '\n'
eth0
eth1
lo
[root@localhost hushuai]#
(3)grep -c grep是一行一行读取的,统计过滤到了多少行,不是多少个
例如:
[root@localhost hushuai]# echo 123 | grep -c '[0-9]'
1
[root@localhost hushuai]# echo 123 | grep -c '0-9' #必须加单引号中括号,和单引号
0
[root@localhost hushuai]# echo 123 | grep '[0-9]'
123
[root@localhost hushuai]# echo 123 | grep -o '[0-9]' #这样我们就能看出[0-9]表示
1 匹配任意一个中括号里面的字母。
2 [^0-9]这样表示取反
3 ^[0-9]以0-9中任意一个字母开头
相关文章推荐
- shell 整理(27)===大小写字母替换修改文件名
- 设计一个函数,根据指定长度生成对应的验证码(由数字和大小写英文字母构成的随机字符串)
- shell 整理(25)=====替换大小写字母
- shell case语句 判断一个字符是字母还是数字
- 一个替换文本文件中某一个关键字附近的某一行的某一段的shell程序:
- 通过一个函数或sql语句,随机生成任意6个字母组成的字符
- shell脚本随机输出一个文件的25行
- [ACM] POJ 1035 Spell checker (单词查找,删除替换添加不论什么一个字母)
- SHELL实现取出一个目录下所有日志文件中的所有IP地址并去重
- 从包含数字和字母的字符串中,取出所有数字并组成一个数(Python)
- php中用正则匹配多个结果,随机替换其中一个结果
- 从标准输入读入一个由字母构成的串(不大于30个字符)。从该串中取出3个不重复的字符,求所有的取法。取出的字符,要求按字母升序排列成一个串。不同的取法输出顺序可以不考虑。
- 程序员面试金典——解题总结: 9.18高难度题 18.3编写一个方法,从大小为n的数组中随机选出m个整数。要求每个元素被选中的概率相同。
- c语言 在控制台输出随机大小字母混合,5*5*5格式
- 请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成
- 给定一个只包含大写英文字母的字符串,可以用另一个字母替换字符串中的任何字母最多k次。查找包含所有重复字母的最长子字符串的长度,
- 一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
- php-Arrays 函数-array_rand-从数组中随机取出一个或多个单元
- Shell 命令行,实现一个获取任意位数的随机密码的脚本
- Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本