玩转Linux Shell编程(五)、文本处理之sed

219 阅读1分钟

本系列目录

  1. Linux Shell和基本指令
  2. Bash shell语法
  3. 正则表达式
  4. 文本处理之grep
  5. 文本处理之sed
  6. 文本处理之awk
  7. Text GUI编程
  8. Tomcat启动脚本分析
  9. gradlew脚本分析

本章和后面一章不会深入了解,因为设计到的东西很多,一时间不能把他们全部说完,

sed可以在不打开文件的情况下操作文本文件,进行替换、搜索、插入、删除,sed是以行为单位的非交互式编辑器,他通过标准输入或文件获得要处理的文本,对指定的行进行逐行处理,然后将结果输出到标准输出或者文件。

他与图形用户界面相比,在终端中可以更快更好地完成某些任务,前提是需要熟练掌握这些命令。

sed 命令的基本格式如下:

$ sed [选项] [脚本命令] 文件名

选项:
 -e :直接在命令行模式上进行sed动作编辑,此为默认选项;
 -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
 -i :直接修改文件内容;
 -n :只打印模式匹配的行;
 -r :支持扩展表达式;

脚本命令:
    a	append,对文本追加,在指定行后面添加一行或多行文本
    d	delete,删除匹配行
    i	insert,插入文本,在指定行之前添加一行或者多行文本
    p	print,打印指定行内容
    s/正则/替换内容/g	匹配正则内容,然后替换内容,g表示全局替换

示例

在某行插入\追加字符

$ cat 1.txt 
1
3
4
$ sed -e 1a2 1.txt 
1
2
3
4

注意的是,sed默认不会对原文件进行修改,只会输出到标准输出,可以加-i选项,也可以使用>>>手动将结果输出到其他文件。

如上,1a2表示在第一行后面追加(a)一个字符2。

而使用i表示在某行前面插入,如sed 2i2 1.txt表示在第2行前面插入字符2。

想在文件最后一行后面追加文本可使用sed '$a5' 1.txt,表示在最后追加字符5。.

删除某行

sed 2d 1.txt

如上,2d表示删除第2行,当然也可以使用区间,sed 1,3d 1.txt表示删除1-3行。

还可以通过!取反,如sed '1,2!d' 1.txt表示删除除了1、2行之外的所有行。

删除带有指定字符的行

sed /2/d 1.txt

如上 /2/d表示删除带有字符2的所有行。

输出某行之后的所有行。

sed '4,$d' 1.txt

显示某区间的行。

sed -n 1,4p 1.txt

显示带有指定字符的行

sed -n /java/p 1.txt

替换文本

$ cat 1.txt 
i love linux
$ sed 's/linux/vb/g' 1.txt 
i love vb

s/linux/vb/g'表示在全局中将所有linux替换为vb,这里可以使用正则,如下,表示将所有a开头的行替换为字母P

sed 's/^a.*/P/g' 1.txt

还有个c命令也可以做到把指定的行替换为新字符,如下,表示把第一行替换为123456

sed '1c123456' 1.txt

删除空白行

sed '/^$/d' 1.txt

删除文件最后一行

sed '$d' 1.txt

打印奇数行

sed -n 'p;n' 1.txt

打印偶数行

sed -n 'n;p' 1.txt

显示行号

sed '=' 1.txt

将所有行开头的字母转换为大写

sed 's/\([a-z]\)\([a-zA-Z0-9]*\)/\u\1\2/g' 1.txt

将检索到的行打印出来

以下命令用于搜索'L'开头的行,并使用'&'符号附加到检索到的行是 - '。 这里。

$  cat 1.txt 
Linux
Window
Android

$ sed -n 's/^L/检索到的行是 - &/p' 1.txt
检索到的行是 - Linux

全部转小写

sed   's/\(.*\)/\L\1/' 1.txt 

全部转大写

sed   's/\(.*\)/\U\1/' 1.txt