sed - 文本分析与转换工具 (3) 实战

  • 原创
  • Madman
  • /
  • 2018-04-11 09:05
  • /
  • 0
  • 296 次阅读

Sed - 文本分析与转换工具 (3) 实战-min.png

Synopsis: 日常工作中会用到sed的地方,经常与管道配合使用。如果是操作字符串,先考虑bash的字符串变量转换,如果达不到目的才考虑使用sed或awk工具。一般用的比较多的是,用sed查找替换一段文本,效率非常的高。对文本内容进行增删改查完全不在话下,同时也可以模拟实现Linux中一些常用的命令功能

sed系列:


1. 常见用法

sed 示例

同一操作指令instruction中包含多个地址addresses或命令command时:

1. 一个操作指令中有多个命令时,多个命令按顺序用;隔开。先输出行号再打印行内容
# sed -n '/nologin/ { = ; p }' /etc/passwd

6. 一个操作指令中有多个地址(即有多个匹配条件)时,多个地址用{}嵌套。第1至10行中,包含nologin字串的行,先输出行号再打印行内容
# sed -n '1,10 { /nologin/ { = ; p } }' /etc/passwd

1.1 查找

使用p命令

1. 打印最后一行
# sed -n '$ p' books.txt
6) A Game of Thrones, George R. R. Martin, 864

2. 打印包含字串Tolkien的行
# sed -n '/Tolkien/ p' books.txt 
2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432

3. 打印第1到3行
# sed -n '1,3 p' books.txt
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

4. 打印奇数行
# sed -n '1~2 p' books.txt
或者:
# sed 'n ; d' books.txt

5. 打印偶数行
# sed -n '2~2 p' books.txt
或者:
# sed '1d ; n ; d' books.txt

1.2 新增

使用ai命令

1. 在末尾追加一行
# sed '$ a hello world' books.txt

2. 在倒数第二行新增字串
# sed '$ i hello world' books.txt

3. 在包含字串Tolkien的行后面新增字串(字串的开头有两个空白字符,以\ 转义)
# sed '/Tolkien/ a \ \ hello world' books.txt

4. 增加两行,字串中间添加\n换行符即可
# sed '/Tolkien/ a hello\nworld' books.txt

1.3 修改

使用sc命令

1. 在1至3行的行头部都添加#
# sed '1,3 s/^/# /' books.txt

2. 在字串Tolkien的前后添加尖括号,修改为<Tolkien>
# sed -n 's/Tolkien/<&>/ p' books.txt  特殊字符&用于存储匹配模式的内容
2) The Two Towers, J. R. R. <Tolkien>, 352 
4) The Fellowship of the Ring, J. R. R. <Tolkien>, 432
或者: 
# sed -r -n 's/(Tolkien)/<\1>/ p' books.txt  扩展正则表达式\1代表第一个匹配组
2) The Two Towers, J. R. R. <Tolkien>, 352 
4) The Fellowship of the Ring, J. R. R. <Tolkien>, 432

3. 将第3行至最后一行替换为指定的字串
# sed '3,$ c Replace the selected lines with text' books.txt
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Replace  the  selected  lines with text

1.4 删除

使用ds命令

1. 删除最后一行
# sed '$ d' books.txt

2. 删除每一行中的数字
# sed 's/[[:digit:]]//g' books.txt
) A Storm of Swords, George R. R. Martin,  
) The Two Towers, J. R. R. Tolkien,  
) The Alchemist, Paulo Coelho,  
) The Fellowship of the Ring, J. R. R. Tolkien,  
) The Pilgrimage, Paulo Coelho,  
) A Game of Thrones, George R. R. Martin,

3. 删除每一行中的第2个以后的数字
# sed 's/[[:digit:]]//2g' books.txt
1) A Storm of Swords, George R. R. Martin,  
2) The Two Towers, J. R. R. Tolkien,  
3) The Alchemist, Paulo Coelho,  
4) The Fellowship of the Ring, J. R. R. Tolkien,  
5) The Pilgrimage, Paulo Coelho,  
6) A Game of Thrones, George R. R. Martin,

2. 相关实例

2.1 移除所有空行

# echo -e "Line #1\n\n\nLine #2" | sed '/^$/ d'
或者:
# echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/! p'

2.2 移除HTML标签

# sed 's/<[^>]*>//g ; /^$/ d' index.html

2.3 注释掉指定行

# sed '2,4 s/^/# /' books.txt

2.4 实现cat命令效果

# sed '' books.txt
或者:
# sed -n 'p' books.txt

2.5 实现wc -l命令效果

# sed -n '$ =' books.txt

2.6 实现head -n 3命令效果

# sed '3 q' books.txt
或者:
# sed -n '1,3 p' books.txt

2.7 实现tail -1命令效果

# sed -n '$ p' books.txt

2.8 实现dos2unix命令效果

Unix使用LF作为换行符,而DOS使用CRLF,这类文件无法在Unix上正确打开,需要替换换行符

# echo -e "Line #1\r\nLine #2\r" > test.txt 
# file test.txt
test.txt: ASCII text, with CRLF line terminators
# cat -A test.txt 
Line #1^M$
Line #2^M$

# sed 's/\r//g' test.txt > new.txt
或者:
# sed 's/^M$//' test.txt > new.txt  # Press "ctrl+v" followed "ctrl+m" to generate "^M" character. 
# file new.txt
new.txt: ASCII text
# cat -A new.txt
Line #1$
Line #2$

2.9 实现unix2dos命令效果

# echo -e "Line #1\nLine #2" > test.txt
# file test.txt
test.txt: ASCII text

# sed 's/$/\r/' test.txt  > new.txt 
# file new.txt
new.txt: ASCII text, with CRLF line terminators

2.10 实现nl命令效果

命令nl可以为输入内容的每一行添加行号

# echo -e "Line #1\nLine #2" | sed '=' |  sed 'N ; s/\n/\t/'
1   Line #1
2   Line #2

2.11 实现cp命令效果

# sed -n 'w dup.txt' books.txt
# diff dup.txt books.txt 
# echo $?
0

2.12 实现expand命令效果

expand命令会转换输入中的TAB为空格,比如Python脚本建议使用4个空格

# echo -e "One\tTwo\tThree" > test.txt
# sed 's/\t/    /g' test.txt > new.txt

2.13 实现tee命令效果

tee命令会将数据输出到标准输出,同时写入文件

# echo -e "Line #1\nLine #2" | tee test.txt
# sed -n 'p; w new.txt' test.txt

2.14 实现cat -s命令效果

# echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" | cat -s
# echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" | sed '1 s/^$//p ; /./,/^$/! d'

2.15 实现grep命令效果

# echo -e "Line #1\nLine #2\nLine #3" > test.txt
# grep "Line #1" test.txt
Line #1

# sed -n '/Line #1/ p' test.txt 
Line #1

2.16 实现grep -v命令效果

# echo -e "Line #1\nLine #2\nLine #3" > test.txt
# grep -v "Line #1" test.txt
Line #2
Line #3

# sed -n '/Line #1/! p' test.txt
Line #2
Line #3

2.17 实现tr命令效果

# echo "ABC" | tr "ABC" "abc"
abc

# echo "ABC" | sed 'y/ABC/abc/'
abc
分类: Linux
标签: GNU sed
未经允许不得转载: LIFE & SHARE - 王颜公子 » sed - 文本分析与转换工具 (3) 实战

分享

作者

作者头像

Madman

如果博文内容有误或其它任何问题,欢迎留言评论,我会尽快回复; 或者通过QQ、微信等联系我

0 条评论

暂时还没有评论.

发表评论前请先登录