感觉现在好久不写shell 都忘的差不多了,尤其是数组的什么的 常用的就不写了 不常用的写个hello world 回顾下,后面继续补充awk sed grep + 正则表达式


1 shell列表,字典,字符串切片,替换

helloworld.sh


#!/usr/bin/env bash
a="hello world!"
echo "a":$a
echo "a0开始取第3个往后:"${a:3}
echo "a0开始取第3个往后2个长度:"${a:3:2}
echo "a的长度是:"${#a}
echo "如果a不存在则为default:"${a=default}
echo "如果b不存在则为default:"${b=default}
echo "从左边开始删*o非贪婪匹配:"${a#*o}
echo "从左边开始删*o贪婪匹配:"${a##*o}
echo "从右边开始删o*非贪婪匹配:"${a%o*}
echo "从右边开始删o*贪婪匹配:"${a%%o*}
echo "o换成O替换一次:"${a/o/O}
echo "o换成O替换全部:"${a//o/O}
echo "a还是:"$a


array=(1 2 3 4)
echo "array是列表所有元素是"${array[*]} ${array[@]}
echo "array是列表长度是"${#array[@]}
echo "array是列表索引是"${!array[@]}
echo "array是列表第一个元素是"${array[0]}
echo "array是列表第二个元素是"${array[1]}

declare -A map
map=([one]=1 [two]=2)
echo "map是字典 长度是"${#map[@]}
echo "map是字典 所有的key"${!map[@]}
echo "map是字典 所有的value"${map[@]}
echo "map是字典 key one的值是"${map[one]}
echo "map是字典 key two的值是"${map[two]}


执行结果是:


a:hello world!
a0开始取第3个往后:lo world!
a0开始取第3个往后2个长度:lo
a的长度是:12
如果a不存在则为default:hello world!
如果b不存在则为default:default
从左边开始删*o非贪婪匹配: world!
从左边开始删*o贪婪匹配:rld!
从右边开始删o*非贪婪匹配:hello w
从右边开始删o*贪婪匹配:hell
o换成O替换一次:hellO world!
o换成O替换全部:hellO wOrld!
a还是:hello world!
array是列表所有元素是1 2 3 4 1 2 3 4
array是列表长度是4
array是列表索引是0 1 2 3
array是列表第一个元素是1
array是列表第二个元素是2
map是字典 长度是2
map是字典 所有的keyone two
map是字典 所有的value1 2
map是字典 keyone的值是1
map是字典 keytwo的值是2


2 正则表达式

2.1 [] 代表枚举 字符组中括号本身不匹配

[0-9] [0123456789]代表0-9任意数字 也可以是 \d是转义字符 叫做字符组简写式

[^0-9] \D 非数字 数字字母下划线标点符号括号乱七八糟

[0-9a-zA-Z_] \w 数字字母下划线

[\t\n\r\]  \s 空白字符

2.2 {}代表量词

{0,1}  == ?

{1,} == +

{0,} == *

行首^  \A


行尾$  \Z
边界 \b  非边界\B


(?i)the  不区分大小写匹配the grep -i 一样

分组

\1 $1 获取前面第一个()匹配的内容

命名分组

(?<>name)  (?name)

python中(?P<name>)   (?P=name)

(?:the|The) 不需要向后引用 (?i:the|The)  忽略大小写不需要向后引用


枚举并集 

[0-3[6-9]]

枚举差集

[a-z && [^m-r]]

2.3 贪心 懒惰 占有

默认贪心

懒惰 后面加? 

5?? 匹配前面?的最小值0

5+?匹配前面+的最小值1

5*?匹配前面*的最小值 0

5{2,5}? 匹配前面{2,5}的最小值2

占有

占有 后面加+

5?+ 

5++

5*+

5{2,5}+ 

2.4 环视

正前瞻

(?=aaa) 紧跟其后的是aaa 但是不匹配aaa

反前瞻

(?!aaa) 紧跟其后的不是aaa 但是不匹配aaa
正后顾

(?<=aaa) 紧跟前面的是aaa 但是不匹配aaa

反后顾

(?<!aaa)紧跟前面的不是aaa 但是不匹配aaa


一个很有用的例子grep -P perl正则 比-E更强大


#!/usr/bin/env bash
echo "asd123234234"|grep -oP "(?<=asd).*?(?=234)"
123
echo "asd123234234"|grep -oP "(?<=asd).*(?=234)"
123234
echo "asd123234234"|grep -Po ".*(?=234)"
asd123234
echo "asd123234234"|grep -oP "(?<=asd).*"
123234234
echo "asd123234234"|grep -Po "(?<=asd).*234$"
123234234
echo "asd123234234"|grep -Po "(?<=asd).*23"
12323423
echo "ASd123234234"|grep -Po "(?i)(?<=asd).*23"
12323423
echo "ASd123234234"|grep -Po "(?i)(?<=asd).*?23"
123
echo "ASd123234234"|grep -Po "(?i)(?<=asd)[1,2,3]*"
12323
echo "ASd123234234"|grep -Po "(?i)(?<=asd)[1,2,3]*?"
echo "ASd123234234"|grep -Po "(?i)(?<=asd)[1,2,3]+?"
1