测试常用linux命令之sed篇
一、sed命令
可以放在单独的脚本文件中执行:sed -f script1 data1
多条命令也可以用{}括起来
sed可以进行文本的替换,删除,行添加,打印等。采用
sed [address]{command1
command2} 文件名的形式
其中adress可以有两种形式:1)行的数字范围。2)用文本模式来过滤出某行。
文本替换:sed '2,$s/dog/cat/g' a.txt 通过模式查找: sed '/hello/s/dog/cat'
行删除: sed '3d' a.txt sed '/number/d' a.txt
插入和附件文本:sed '5i\new line' a.txt sed '3o\new line' a.txt
注意这些修改都是基于流的,如果想要在源文件上修改,需要加上-i选项。
打印: sed -n '3,5p' 基于文本匹配的 sed -n '/pattern/p'
sed的一些高级知识
n;提取文本的下一行,代表从文件流的下一个文本行进行处理
N;代表将下一行加到已经在模式空间的文本上
自己使用的一直是sed命令的模式空间,其实它还有一个保持空间
h:将模式空间复制到保持空间
H:将模式空间附加到保持空间
g:将保持空间复制到模式空间
G:将保持空间附件到模式空间
x:交换模式空间和保持空间的内容
相当于将一部分后面需要的内容先保存,最后再用g,G命令将数据从保持空间复原到模式空间。
其他:!代表符合特定模式的不怎么怎么着。。。
三、具体案例
#!/bin/sh #该脚本用来实现统计一个目录下所有的文件个数 all_count=0 for filePath in `echo $PATH | sed 's/:/ /g'` do count=`ls $filePath | wc -l` echo "$filePath":"$count" all_count=$[$all_count+$count] done echo "all_count:"$all_count
sed -i '/^$/d' a.txt
cat a.txt | sed 'N;s/\n/ /g'
cat a.txt | sed '/line2/{N;s/\n/ /g}'
之前自己一直采用的cat -n的方式,这种方法自然可以,只不过行号的格式往往不是想要的 sed '=' a.txt | sed 'N;s/\n/\t/g'
sed -i 's/^ //g' a.txt
cat a.txt | sed '/./,/^$/!d'
cat a.txt | sed '/./,/$/!d' (从有文字的行到最后一行,都不删除)
cat a.txt | sed 's/<[^>]*>//g' 需要忽略任何嵌入原始标签的大于号