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