处理文本的工具sed

sed 是非交互的,文本命令行编辑工具

如下命令知道什么意思吗?
sed -n ‘n;p’
sed -n ‘1!G;h;$!d’
sed ‘$!d’
sed ‘$!N;$!D’
sed ‘^$/d;G’
sed ‘n;d’
sed ‘G’
例子:

#删除文件中的第四行
#sed ‘4d’ out.txt >output.txt

#将文件中第20行到30行之间的 hello 单词替换为 world
#sed ‘10,20s/hello/world’ input.txt >out.txt
**
不知道,那就往下看吧。

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

官方地址为
http://www.gnu.org/software/sed/

用法:
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 偶数行

sed工具
编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a []text 在指定行后面追加文本,支持使用\n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理

sed工具
 s/// 查找替换,支持使用其它分隔符,s@@@,s###
替换标记: g 行内全局替换 p 显示替换成功的行 w /PATH/FILE 将替换成功的行保存至文件中
sed示例
sed ‘2p’ /etc/passwd
sed -n ‘2p’ /etc/passwd
sed -n ‘1,4p’ /etc/passwd
sed -n ‘/root/p’ /etc/passwd
sed -n ‘2,/root/p’ /etc/passwd 从2行开始
sed -n ‘/^$/=’ file 显示空行行号
sed -n -e ‘/^$/p’ -e ‘/^$/=’ file
Sed‘/root/a\superman’ /etc/passwd行后
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行
sed示例
sed ‘/^$/d’ file
sed ‘1,10d’ file
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed ‘s/test/mytest/g’ example
sed –n ‘s/root/&superman/p’ /etc/passwd 单词后
sed –n ‘s/root/superman&/p’ /etc/passwd 单词前
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
sed –i.bak ‘s/dog/cat/g’ pets

高级编辑命令
P: 打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环

================================================================
sed 经常被使用于文本过滤,它接受文本输入,对文本
进行一些操作或者一组操作,同时将修改后的文本输出
sed通常使用于模式匹配,提取文件的一部分,或者
替换文件内多次出现的字符串。

sed的选项

  1. 单个字符{如果没有特殊字符},进行匹配文本
  2. 匹配前一个字符的零个或多个重复序列分组或着类
  3. + 和*类似,但匹配一个或者更多
  4. ? 和*类似,仅匹配0次或者1
  5. {i} 和*类似,但是和i 完全匹配,匹配的字符介于 0-255
  6. {i,j} 介于 ij 之间,包括i,j
  7. {i,} 匹配多个或者匹配i
  8. {,j} 最多匹配j或者等于j
  9. (RE)\ 组作为一个整体,用于:
  10. 应用后缀运算符,如 '(abcd)',这将搜索零个或者多个完整的
  11. "abcd"序列,如果 'abcd*', 它将搜索"abc",后面跟0个或者多个d
  12. 使用反向引用
  13. . 匹配任意字符
  14. ^ 匹配行首的空字符串,即^之后出现的内容必须出现在行首,
  15. 例如:
  16. '^#include' 将只匹配第一行中的 “#include”的行,
  17. 但是,如果之前有一两个空格,那么匹配失败。
  18. $ 和^类似,匹配行尾
  19. \c 匹配字符 "C" 用于匹配特殊字符
  20. [list] 匹配列表中的任意单个字符。 例如: [aeiou] 匹配所有原音
  21. [^list] 匹配不再列表的任意字符。
  22. 列表可以由 - , 表示,和之间的
  23. 所有字符都要包含再列表中,使其成为列表中第一个包含`]' 的字符
  24. '-' 使得其成为第一个或者最后一个字符
  25. RE1|RE2 匹配RE1或者RE2
  26. \1 \2 \3 \4 \5 \6 \7 \8 \9, => \i
  27. 匹配re的第i个引用,这称为反向引用,通常它非常慢
  28. 注意:
  29. sed 某些实现可能没有提到所有的res,特别是 '+' '?'
  30. '|'
  31. -RE 是贪婪的,如果检测到两个或者更多匹配,它选择最长的,如果有
  32. 两个或者更多学则具有相同大小的,它选择文本中的第一个
  33. 例子:
  34. 'abcdef' 匹配"abcdef"
  35. 'a*b' 匹配0个或者多个 “a” ,后面跟一个"b"
  36. 比如: "b" 或者 “aaaaab”
  37. 'a?b' 匹配 "b"或者"ab"
  38. 'a+b+' 匹配1个或多个 "a",然后是一个或多个 "b",最小匹配将是
  39. "ab",但是 "aaaab" 或"aaaaabbbbb"也依然匹配
  40. '.*' 全匹配,文本所有行的字符,包括空字符
  41. '.+' 全匹配,但仅包含至少一个字符的行,也就是说,空行不匹配。
  42. 'main(.)' 搜索 “main”的行作为改行的第一件事,该行还包含一个
  43. 左括号和右括号, () 是任意数量字符(包括空)前后的左括号。
  44. '^#' 匹配 "#"号开始的行
  45. '\$' 所有单个以 '' 结尾的行,有两个,用于转义。
  46. 'a-zA-Z_' 任意字母或者数字
  47. '[^ ]+' (一个tab键和一个空格) 不是空格或 制表符的任何字符的一个或者多个
  48. '^.A.$' 匹配中间有 "A" 的字符
  49. 'A.{9}$' 匹配正好是第十行的最后一个字符 “a”
  50. '^.{,15}A' 匹配该行前16个字符的最后一个 "A"
  51. 使用sed
  52. 使用方式
  53. sed [-e script] [-f script-file] [-n] [files...]
  54. -n 进行测试,防止修改文件,没有输出
  55. -e 内嵌脚本, 命令行中给的sed执行脚本,可以给出多个命令行脚本,每个脚本都有
  56. 一个-e选项,事实上,-e仅存在多个脚本时才需要 {由先前的-e或者-f指定}
  57. -f 读取指定文件是,有几个选项

选项:
-d 删除指定行数 和s/.*// b 有点像
-n 跳到下一行 即模式空间被下一行的内容替换
a\ 在指定行后添加

i\ 类似a\但是在指定行之前插入
c\ 更改行
-p 输出指定行
l 列出
-w 写入指定行到文件
-r 读取行,在指定的行后插入多行
-N 下一行
-D 删除第一行{包含第一行}之前的所有内容,然后跳到脚本的开头,加载下一行,如果只编辑一行,那么和d相同
-P 打印模式空间的第一部分,将所有内容写到第一行,如果模式空间是单行,那么和p相同

===================================
! 不要 否定下一个命令的地址规范,注意,如果我们省略了地址,那么我们指的所有的行
例如: sed ‘!s/foo/bar/‘
sed ‘/./!d’ 有不同的含义:删除所有空行

/./!d 删除所有空行
s/^\n$// 找到一个空行保留他,并删除所有下列空行
s/^ // 删除有行首空格的行
s/^
$// 删除有行尾是空格的行
s/^(.{80}).*$/\1 保留前80个字符

s/( )\1$/#\1%\1
s/^(.
)#(.)%(.)$/\2\1\3/
将一行的空格 分成两半,一个表示beg, 第二个表示行尾

s/\/*.\\/// 删除//

s/9(*)$/\1/ 用 _替换所有 前导9

if there aren’t any digits left, add a MostSign Digit 0
#
s/^(_*)$/0\1/

incr last digit only - there is no need for more
#
s/8(*)$/9\1/
s/7(
)$/8\1/
s/6(_
)$/7\1/
s/5(*)$/6\1/
s/4(
)$/5\1/
s/3(_
)$/4\1/
s/2(*)$/3\1/
s/1(
)$/2\1/
s/0(_
)$/1\1/

====================

s/\/$//
s/[^/]
$//
/*/!c\
s/\/$// 删除尾部

=======
—选项
: