sed
sed为行编辑器,默认不编辑原文件,仅对模式空间中的数据做处理。
sed 'AddressCommand' file... # 对file文件中符合地址的哪些行(Address)进行命令操作(Command)
AddressCommand之间没有空格
Address:
1. StartLine,EndLine
比如: 1,100 处理1到100行
2. /RegExp/ 正则表达式
比如: /^root/ 开头为root的行
3. /pattern1/,/pattern2/
比如:第一次符合pattern1的行开始,至第二次符合pattern2的行,之间的行
4. StartLine,+N
从StarLine行开始的N行,共N+1行
5. $
最后一行
命令 Commond
d 删除
p 打印
a \string 在指定的行后面追加新行(string)
i \string 在指定的行前面添加新行(string)
r FILE 读取FILE文件的内容再来添加到符合Address的行后面。
w FILE 将file中符合Address的行另存到FILE文件中。
s /pattern/string/ 将file中符合pattern的字符串替换为string ,默认为每行中第一次被pattern匹配到的字符串。
修饰符
修饰符必须在命令的后面,比如: s /pattern/string/修饰符
g 全局 s /pattern/string/g 全局替换
i 忽略大小写 s /pattern/string/i 匹配时忽略大小写
例子:
sed -n ‘20 ,30p’123.txt 打印123.txt中的第20到30行,带 –n 是静默输出,也就是只输出处理后的结果,不将整个模式空间的内容都输出。
sed -n ‘20 ,+10p’123.txt 打印123.txt中的第20到30行
sed -n ‘20 ,$p’123.txt 打印123.txt中的第20到最后一行
sed -n ‘2~2p’123.txt 打印123.txt中的第2,4,6…偶数行
sed -n ‘1~2p’123.txt 打印123.txt中的第1,3,5…奇数行
sed -n ‘p’123.txt 将123.txt中的内容重复输出。sed查找输出一次,p输出一次。
sed -n ‘/xxw/p’123.txt 将匹配xxw的行都输出,注:xxw不带引号。在sed中,使用正则表达式,用//将正则表达式包围起来。
sed -n ‘/xxw/,/ting/p’123.txt 对123.txt中匹配xxw的行和匹配ting的行之间的行进行打印操作
sed -n ‘10,/xxw/p’123.txt 对123.txt中第10行到匹配xxw的行之间进行p操作
sed ‘2c xiaodd’123.txt 对123.txt中第2行替换成xiaodd,并显示。
sed '3s#xxw#ting#g' 123.txt 对123.txt中的第3行进行xxw匹配并替换成ting
echo xiao xian wen xxw is a man | sed 's#^.*en\([a-z].*\) is .*$#\1#g' 取出其中的xxw(分组替换)。
sed -r 's#(.*)#&xxw#g' 123.txt 将123.txt中每行后面加上xxw,-r代表使用正则扩展表达式,$代表前面匹配的所有内容,并非是括号中的内容,如果需要,后面接\1 \2 等。
ls *.txt | sed -r 's#(.*).txt#mv & \1.sh#e ' 列出本目录下所有txt文件并传递给sed,sed匹配并替换出”mv 1.txt 1.sh ” e的作用就是用来传递给bash执行。(修改目录下所有.txt文件改为.sh文件,还有一种方法是用renname 例如: rename .txt .sh *.txt
注:在sed中 用 –r 后,后面的匹配括号不用接转义\ .
sed -n '2p;4p;5p' 123.txt 显示123.txt中的第2,4,5行
sed -n ‘20 d’123.txt 删除123.txt中的第20行
sed -n ‘20 ,30d’123.txt 删除123.txt中的第20到30行
sed -n ‘/xxw/d’123.txt 删除123.txt中匹配xxw的行
sed ‘/xxw/a\is’123.txt 在123.txt中匹配xxw的行后面增加1行is,然后输出。注:这里并没有改变123.txt的内容,只是输出改变而已。不带–n ,因为带了会只输出增加的一行。
sed ‘/xxw/i\is’123.txt 在123.txt中匹配xxw的行前面增加1行is,然后输出。
sed ‘s/xxw/ting/’123.txt 在123.txt中匹配xxw并将找到的第一个替换成ting。
sed ‘s/xxw/ting/g’123.txt 在123.txt中匹配xxw并将找到的全部替换成ting。
sed -i 's/25/xxw/' 123.txt 将123.txt中的匹配到的字符串25替换成xxw并保存到原文件。等同于: echo $(sed 's/25/xxw/' 123.txt) > 123.txt
sed ‘s/xxw/ting/i’123.txt 在123.txt中匹配xxw并将找到的第一个替换成ting,忽略大小写
sed ‘s/xxw/ting/ig’123.txt 在123.txt中匹配xxw并将找到的全部替换成ting。忽略大小写
sed -n '/^\//p' 123.txt 在123.txt中匹配以/开头的行
注: sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。所以在脚本中想用[ $? -eq 0 ]来确认前面的sed语句是否执行错误是不可能的。