首页 > 其他 > 详细

文本处理工具

时间:2019-05-28 10:41:31      阅读:119      评论:0      收藏:0      [点我收藏+]
文本处理工具

??在Linux中学会对文本的处理也是很重要的,对文本快速的过滤和查找,替换,编辑,可以大大地提高工作的效率,在编辑脚本时也可以灵活地运用,下面和大家介绍一下我们常用的文本处理工具。

第一剑客:grep

grep:
??作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行。
??模式:由正则表达式字符及文本字符所编写的过滤条件。
选项:
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
? -w 匹配整个单词
? -E 使用ERE
? -F 相当于fgrep,不支持正则表达式
? -f file 根据模式文件处理
格式:

grep [OPTIONS] PATTERN [FILE...]

匹配包含root的行:

grep “root” /etc/passwd

匹配不包含“root”的行:

grep -v “root” /etc/passwd

只输出匹配的部分:

echo this is a test line. | egrep -o "[a-z]+\."
结果 line

递归搜索文件

grep "text" . -r -n
#.当前目录下

忽略大小写:

echo "hello world" | grep -i "HELLO"
结果 hello

在grep搜索结果中包括或者排除指定文件:

#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}
#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"
#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist

打印出匹配文本之前或者之后的行:

#显示匹配某个结果之后的3行,使用 -A 选项:
seq 10 | grep "5" -A 3
5
6
7
8
#显示匹配某个结果之前的3行,使用 -B 选项:
seq 10 | grep "5" -B 3
2
3
4
5
#显示匹配某个结果的前三行和后三行,使用 -C 选项:
seq 10 | grep "5" -C 3
2
3
4
5
6
7
8
#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
a
b
--
a
b

第二剑客:sed

sed:Stream EDitor, 行编辑器
?sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时
缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的
内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。
如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清
空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重
定向存储输出。
?功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

用法:

sed [option]... ‘script‘ inputfile...?

常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 备份文件并原处编辑
script:
‘地址命令‘
sed工具
?地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
  #:指定的行,$:最后一行
  /pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
  #,#
  #,+#
  /pat1/,/pat2/
  #,/pat1/
(4) ~:步进
  1~2 奇数行
  2~2 偶数行?
编辑命令:
  d 删除模式空间匹配的行,并立即启用下一轮循环
  p 打印当前模式空间内容,追加到默认输出之后
  a []text 在指定行后面追加文本,支持使用\n实现多行追加
  i []text 在行前面插入文本
  c []text 替换行为单行或多行文本
  w /path/file 保存模式匹配的行至指定文件
  r /path/file 读取指定文件的文本至模式空间中匹配到的行后
  = 为模式空间中的行打印行号
  ! 模式空间中匹配行取反处理

 s/// 查找替换,支持使用其它分隔符,s@@@,s###
?替换标记:
  g 行内全局替换
  p 显示替换成功的行
  w /PATH/FILE 将替换成功的行保存至文件中
替换操作:s命令
替换文本中的字符串:

sed ‘s/book/books/‘ file

-n选项 和 p命令 一起使用表示只打印那些发生替换的行:

sed -n ‘s/test/TEST/p‘ file

直接编辑文件 选项-i ,会匹配file文件中每一行的第一个book替换为books:

sed -i ‘s/book/books/g‘ file

全面替换标记g
使用后缀 /g 标记会替换每一行中的所有匹配:

sed ‘s/book/books/g‘ file

当需要从第N处匹配开始替换时,可以使用 /Ng:

echo sksksksksksk | sed ‘s/sk/SK/2g‘
skSKSKSKSKSK
echo sksksksksksk | sed ‘s/sk/SK/3g‘
skskSKSKSKSK
echo sksksksksksk | sed ‘s/sk/SK/4g‘
skskskSKSKSK

定界符
以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:

sed ‘s:test:TEXT:g‘
sed ‘s|test|TEXT|g‘

定界符出现在样式内部时,需要进行转义:

sed ‘s/\/bin/\/usr\/local\/bin/g‘

删除操作:d命令
删除空白行:

sed ‘/^$/d‘ file

删除文件的第2行:

sed ‘2d‘ file

删除文件的第2行到末尾所有行:

sed ‘2,$d‘ file

删除文件最后一行:

sed ‘$d‘ file

删除文件中所有开头是test的行:

sed ‘/^test/‘d file

子串匹配标记\1

匹配给定样式的其中一部分:

echo this is digit 7 in a number | sed ‘s/digit ([0-9])/\1/‘
this is 7 in a number

命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,(..) 用于匹配子串,对于匹配到的第一个子串就标记为 \1 ,依此类推匹配到的第二个结果就是 \2 ,例如:

echo aaa BBB | sed ‘s/([a-z]+) ([A-Z]+)/\2 \1/‘
BBB aaa

love被标记为1,所有loveable会被替换成lovers,并打印出来:

sed -n ‘s/(love)able/\1rs/p‘ file

从文件读入:r命令
file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:

sed ‘/test/r file‘ filename

写入文件:w命令
在example中所有包含test的行都被写入file里:

sed -n ‘/test/w file‘ example

追加(行下):a\命令
将 this is a test line 追加到 以test 开头的行后面:

sed ‘/^test/a\this is a test line‘ file

在 test.conf 文件第2行之后插入 this is a test line:

sed -i ‘2a\this is a test line‘ test.conf

插入(行上):i\命令
将 this is a test line 追加到以test开头的行前面:

sed ‘/^test/i\this is a test line‘ file

在test.conf文件第5行之前插入this is a test line:

sed -i ‘5i\this is a test line‘ test.conf

下一个:n命令
如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:

sed ‘/test/{ n; s/aa/bb/; }‘ file

文本处理工具

原文:https://blog.51cto.com/14322593/2400377

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!