查看sed命令帮助信息:
具体使用方法上面都有介绍,sed是一个流编辑器,它会读取文件中的每一行数据,然后放入缓冲区(也称为模式空间)中进行处理,处理完后再读取下一行数据,如此反复,所以它是针对行级别的一个处理。
默认sed命令处理完后会将文件内容打印到屏幕,
- -e选项:可以指定一个处理的脚本语句,也可以省略。
- -n选项:打印模式空间处理后的内容,不指定则打印整个模式空间内容。
- -s选项:在同时指定多个文件时使用,否则将被认为是一个长输入。
- -i选项:写入文件,否则只是打印到屏幕。
脚本支持的选项有:
这些都可以通过man手册查看。
比如打印第一行:
值得注意的是,-e编辑脚本应该用单引号,而不是双引号,多数情况双引号也可以用。在linux系统中,单引号与双引号是有区别的,双引号会进行变量替换等,单引号则是纯字符串。
打印出每一行的行号:
sed '=' filename
所以只需要打印出最后一行的行号,即可知道总行数。
打印总行数:
sed -n '$=' filename
这里也支持正则表达式元字符。
打印开头为root的行:
在脚本中指定相应的正则即可,/后面就是一组,直到遇到下一个同样的标识符/,替换其实也可以看做是查找然后替换,所以语法是
s/old/new/
打印开头为root的行到开头为ftp的行:
删除第二行到最后一行(这里没有指定-n选项,表示打印模式空间内容,即没有被删除的行,第一行):
将第一行的root都替换为ROOT,打印结果。
可以同时指定多个脚本,多个脚本的时候需要显式的指定 -e 选项,后面跟脚本,按顺序执行,先将第一行替换root为ROOT,然后打印第一行。
比如将小写转换为大写:
sed 's/[a-z]/\u&/g' filename
将大写转换为小写:
先将源文件内容修改为转换大写之后的内容
查看源文件:
sed 's/[A-Z]/\l&/g' filename
注意,这里的 \l&是字母L。
如果要替换首字母,则用正则表达式里的\b来匹配边界。
sed 's/\b[A-Z]/\l&/g' filename
这里转为了首字母小写,其余字母大写;转为首字母大写,其余小写写法是相同的:
sed 's/\b[a-z]/\u&/g' filename
这个也比较好记,转大写是 \u(upper),转小写是 \l(lower)。
\u:将下一个字符转为大写。
\U:将所有字符转为大写。
\l:将下一个字符转为小写。
\L:将所有字符转为小写。
这里(root)匹配的是 root 四个字符。所以 \u 将 root 的第一个字符 r 转为了大写 R。
这里 [root] 匹配的是一个取值范围,只要是 root 这四个字符都会被匹配到,所以匹配到的是单独是四个字符,而不是一个字符串,与上面对比,上面匹配的是一个字符串,这里的四个字符被 \u 接收到,于是就将四个字符都转为了大写。
上面的方式也可以将字符都转为大写:
小写同理。
至于这个&符号,代表上次命令的执行结果,拿上面的例子来说,s/[A-Z]/\l&/g
首先匹配[A-Z],&符号的位置将被替换为这个匹配结果,然后对这个匹配结果执行\l命令。
比如下面的例子:匹配root,然后用&接收匹配到的root,变为root is best。
暂时学会这么多,后续再补充。
在查找时忽略大小写,与其他的不同,grep是用 -i 来忽略大小写,sed是 I 忽略大小写。例如:
文件如下
查找包含root不区分大小写:
|
在替换 s 命令中就是小写 i 了:
|