Linux三剑客命令—sed
sed是一个“交互式的”面向字符流的编辑器,它被认为是面向字符流的,这是因为输入流通过程序将输出直接送到标准输出端。输入一般来自文件,但也可可以直接来自键盘。输出在默认情况下是在终端的屏幕上,但是也可以输出到文件中,sed能够通过解析脚本来工作,该脚本指定了将要执行的动作。
sed在处理文件时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容发送到输出端,然后接着处理下一行,这样不断重复,直至文件末尾。这个过程中文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
调用sed命令有两种形式:
sed [options] command file
sed [options] -f scriptfile file
【常用选项参数】
-n, --quiet, --silent 取消自动打印模式空间 |
-e script, --expression=script 在指令模式上进行sed的动作编辑 |
-f script-file, --file=script-file 以脚本文件的内容作为sed执行的指令 |
-i[SUFFIX], --in-place[=SUFFIX] 编辑文件,不输出 |
-c, --copy 使用复制代替重命名指定文件 |
-l N, --line-length=N 为l命令指定行数 |
-s, --separate 把文件作为独立的个体而不是单独连续的字符流 |
【常用命令参数】
a \ | 追加文本 |
i \ | 直接修改内容 |
r filename | 从文件中读行 |
c \ | 替换指定文本 |
d | 从模式空间删除行 |
D | 删除pattern space内第一行 |
h/H | 复制/追加pattern space的内容到hold space |
g/G | 复制/追加hold space到pattern space |
l | 列出行的内容 |
n/N | 读取/追加下一行的内容到pattern space |
p | 打印模式空间的内容,通常与-n一起使用 |
s | 替换指定字符 |
w | 将模式空间写入文件 |
x | 交换pattern space和hold space的内容 |
【sed替换标记】
g | 全局替换 |
p | 打印 |
w | 把行写入文件 |
x | 交换pattern space和hold space的内容 |
y | 表示把一个字符翻译成另一个字符 |
\1 | 子字符串匹配标记 |
& | 已匹配的字符串标记 |
追加:
sed 'a\the end\' sed.txt 在所有行末尾追加一行“the end”
sed '$a\the end\' sed.txt 在最后一行末尾追加“the end”
sed '3,5a\the end\' sed.txt 在3到5末尾追加“the end”
sed 's/^/\#&/g' sed.txt 在每行开头加上“#”
sed 's/$/&\!/g' sed.txt 在文件中每行结尾加上“!”
sed '$r sed.txt' sed.txt 将文件sed.txt的内容追加到sed.txt的最后一行
插入:
sed 'i A' sed.txt 在每一行前插入“A”
sed '1i\begin\' sed.txt 在第一行前插入一行“begin”
替换:
sed '1,2c str' sed.txt 将1-2行替换为“str”(1-2行合并被替换)
sed 'y/ad/AD/' sed.txt 替换所有匹配字符“a”->“A”,“d”->“D”
批量替换IP地址
sed -r 's/192.168.0.([0-9]{1,2})/172.16.0.\1/g' sed.txt
删除:
sed -e '2d' sed.txt 删除第2行
sed -e '3,$d' sed.txt 删除第3行到末尾
sed -e '$d' sed.txt 删除最后一行
sed -e '/^\#/'d sed.txt 删除以“#”开头的行
sed -i '/^$/d' sed.txt 删除空白行
sed 's/[ ]*//g' sed.txt 删除空格
sed 'N;$!P;D' sed.txt 删除倒数第2行
sed 'N;$!P;$!D;$d' sed.txt 删除倒数2行
若要删除最后n行,可参考如下:
max=$(sed -n '$=' sed.txt)
sed $(($A-n+1)),${A}d sed.txt
其他示例:
sed '=' sed.txt 打印所有行号
sed '$=' sed.txt 打印最后一行的行号
sed -n '$=' sed.txt 打印总行数
sed -i.bak 's/123/321/g' sed.txt 修改文件前备份
将sed文件中包含“hello”字符串的行复制到temp文件中。
sed -e '/hello/w temp.txt' sed.txt
sed '/^$/d;G' sed.txt 删除所有空白行,并在每一行后面增加一个空行
sed -e '1h' -e '3x' sed.txt 将第1行的数据覆盖第3行
sed '1h;3G' sed.txt 将第1行复制到第3行后面
sed '1h;1d;$g' sed.txt 将第1行剪切覆盖最后1行
将包含“test”字符串的所有行上替换“123”->“321”,然后“cba”->“abc”
sed -e '/test/s/123/321/g' -e 's/abc/cba/g' sed.txt
sed -e '/test/s/123/321/g ; s/abc/cba/g' sed.txt
打印奇数行
sed -n -e 'P' -e 'N' sed.txt
sed -n 'p;n' sed.txt
sed -n '1~2p' sed.txt
打印偶数行
sed -n 'n;p' sed.txt
sed -n '2~2p' sed.txt