详解shell脚本(八)——正则表达式和文本替换

正则表达式

#IP地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

[0-9]或[:digit:]匹配数字0~9。{1,3}匹配1到3个数字,.匹配”.”。

表 4-1:

正则表达式 描述 示例
- 行起始标记 -tux匹配以tux起始的行
tux 行 尾 标 记 t u x 匹配以tux结尾的行
. 匹配任意一个字符 hack.匹配hackl和hacki,但是不能匹配hackl2和hackil 它只能匹配单个字符
[] 匹配包含在[字符]之中的任意一个字符 coo[kl]匹配cook或cool
[^] 匹配除字符之外的任意一个字符 901匹配92,93,但是不能匹配colouur
[-] 匹配[]中指定外围内的任意一个字符 [1-5]匹配1~5的任意一个数字
? 匹配之前的项1次或0次 colou?r匹配color或colour,但是不能匹配colouur
+ 匹配之前的项1次或多次 Rollno-9+匹配Rollno-99.Rollno-9,但是不能匹配Rollno-
* 匹配之前的项0次或多次 co*l 匹配cl,col,coool等
() 创建一个用于匹配的子串 ma(tri)?x匹配max或maxtrix
{n} 匹配之前的项n次 [0-9]{3} 匹配任意一个三位数,[0-9]{3}可以扩展为0-9[0-9]
{n,} 之前的项至少需要匹配n 次 [0-9]{2,}匹配任意一个两位数或更多位的数字
{n,m} 指定之前的项所必需匹配的最小次数和最大次数 [0-9]{2,5}匹配两位数到五位数之间的任意一个字数
| 交替—匹配|两边的任意一项 Oct {1st | 2nd} 匹配Oct 1st或Oct 2nd
\ 转义符可以将上面介绍的特殊字符进行转义 a \ .b 匹配a.b,但不能匹配ajb。通过在.之前加上前缀\,从而忽略了.的特殊意义

grep命令只解释match_text中的某些特殊字符。如果要使用正则表达式,需要添加-E选项——这意味着使用扩展(extended)正则表达式。或者也可以使用默认允许正则表达式的grep命令——egrep

grep -l linux sample1.txt sample2.txt

和-l相反的选项是-L,它会返回一个不匹配的文件列表。

grep "test_function()" . -R -n

这是开发人员使用最多的命令之一。它用于查找某些文本位于哪些源码文件中。

cut 按列切分文件

cat student_data.txt
NO  Name    Mark Percent
1   Sarath  45  90
2   Alex    49  98
3   Anu     45  90
cut -f3 --complement student_data.txt

使用sed进行文本替换

sed 's/pattern/replace_string/' file
#打印的同时替换结果应用于原文件
sed -i 's/text/replace/' file
sed -i 's/pattern/replace_string/g' file
#后缀/g意味着sed会替换每一处匹配。但是有时候我们只需要从第n处匹配开始替换。对此,可以使用/Ng选项
#已匹配字符串标记(&)
echo this is an example | sed 's/\w\+/[&]/g'
#正则表达式\w\+匹配每一个单词,然后我们用[&]替换它。
echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'

([a-z]+)匹配第一个单词,([A-Z]+)匹配第二个单词。\1和\2用来引用它们。这种引用被称为向后引用(back reference)。在替换部分,它们的次序被更改为\2 \1,因此结果就呈现出逆序的形式。

你可能感兴趣的:(shell脚本与Linux)