stream editor
文件或命令行获取一行文本,进行处理输出,不修改原始文本
从命令行读取是输入一行,处理一行,再输入一行(这就是第二行),结束Ctrl+D(发送EOF)
行匹配模式:
什么也没有代表匹配所有行
2 //第二行
2,3 //第二行到第三行
2,$ //第二行到最后一行,$代表最后一行
/pattern/ //匹配pattern的行
/pattern1/,/pattern2/ //匹配pattern1的行(包含自己)到匹配pattern2的行(包含自己),可以有多个区间
行模式后可有一到多个命令,一个直接放后面,多个{}并加 ;分隔 2{s/aa/bb/;s/cc/dd}
,不想用分号可如下单引号(次提示符)
多个命令,即多个(行模式+命令) 可用 ;分隔 ,也可以-e 后面添加命令 sed -e 's/aa/bb/;s/cc/dd/' -e 's/ww/tt/' aa.txt
sed 's/aa/bb/;s/cc/dd/' aa.txt
不想用;分隔可以多行输入在单引号(次提示符)行开始,单引号行结束
sed '
s/aa/bb/
s/cc/dd/
' aa.txt
-f 指定命令文件
1 s 替换
s/aa/bb/ 只替换行中第一个aa为bb
s/aa/bb/2 只替换第二个
s/aa/bb/g 替换行中所有aa
s/aa/bb/p (如果模式匹配,替换成功,再打印替换后的文本,总共打印了两次)
-n 禁止输出,但是禁止不了p, sed -n 's/aa/bb/p' aa.txt 每一行不管是否有替换都会输出一次,有匹配替换的话行还会多输出一次,-n 禁止了原始的输出,只有p导致才会输出
s/aa/bb/w aa.txt 有匹配替换的话行还会多输出一次到指定文件
s的文本包含/,转义为\/, 或者其他字符替换/作为分隔符,如 s!a/a!b/b!
2 d 删除
3 i 前面插入新行 a 后面插入新行
sed '3i\hello,xu'
插入多行 如下
sed '3a\
hello,xu\
ok,man' aa.txt \\第一个\用来分隔命令和文本,插入多行那么除最后一行每行后面加\ 且需要多行输入
4 c 修改 sed '3c\hello,xu'
,特殊情况使用2,3c 会把2行和3行改为新的一行
5 y 字符替换 y/abc/def/
每个a改成d,每个b改成e等
6 单独的p:打印文本行,=:打印行号,l :列出行,含换行符(用$表示)等特殊符号,这些-n都禁止不了
7 w 写入文件 1,2w out.txt
r 读取文件 3,4r data.txt
第三行输出后,读取并输出data.txt的内容,第四行一样