[转]sed常用命令总结
转自:http://blog.chinaunix.net/uid-26963748-id-3249732.html
一、Sed简介
Sed:Stream Editor 流式编辑器 又称行编辑器,每次只编辑一行。Sed工作是在“模式空间”中进行的,并不操作源文件。对源文件无危害。
二、Sed使用格式
Sed命令的常用格式如下:
(1)Sed [options] ‘script’ input_file…
(2)Sed [options] –f script_file input_file…
(3)Sed [options] ‘ADDR1,ADDR2command’ input_file…
例如:#sed ’1,2d’ fstab 就可以将fstab的前两行删除并显示出来,但是它不会改变源文件。
#Sed ‘1,2!d’ fstab 表示删除除第一行和第二行之外的所有行。
(4)Sed [options] ‘/PATTERN/command’ input_file……
&:s/l..e/&er/:表示引用前面匹配到的所有字符。
例如:sed ‘/[[:upper:]]/d’ binary.sh 表示删除所有的大写字母的行。
(5)Sed ‘/PATTERN1/,/PATTERN2/command’ input_file……
说明:这表示从第一次被PATTERN1匹配到的行到第一次被PATTERN2匹配到的中间的所有行执行command命令。
三、Sed的常用选项:
-n:只显示sed匹配到的行。其余行不显示。下文有范例。
-i :可以直接操作原文件。默认情况下sed不会改变原文件,但是-i选项可以修改原文件,此选项应慎用。
-r:可以使用标准正则表达式。默认情况下sed只支持基本正则表达式,但是加上-r选项后则支持扩展正则表达式
-e:多脚本共用。可以同时执行多个命令。例如:
[root@localhost ~]# sed -e 's@\<h\([[:alpha:]]*\)\>@H\1@g' -e 's@\(l..e\)\.@\1r.@g' test
He love His lover.
She like Her liker.
Dove love Her liker.
也可以这样用,中间用分号隔开:
[root@localhost ~]# sed 's@\<h\([[:alpha:]]*\)\>@H\1@g;s@\(l..e\)\.@\1r.@g' test
四、Sed的常用命令
(1)P:模式空间中的文本在处理之前,每一次都会先显示一下;用p命令后再显示一下,即:匹配到的文本显示两次:例如:
[root@localhost ~]# sed '1,2p' fstab
/dev/vol0/root / ext3 defaults 1 1
/dev/vol0/root / ext3 defaults 1 1
/dev/vol0/home /home ext3 defaults 1 2
/dev/vol0/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda3 swap swap defaults 0 0
我们可以看到第1,2行显示了两次。如果你只想显示用sed处理的行,则可在其前加-n选项。例如:sed -n ‘1,2p’ fstab 其显示结果如下:
root@localhost ~]# sed -n '1,2p' fstab
/dev/vol0/root / ext3 defaults 1 1
/dev/vol0/home /home ext3 defaults 1 2
(2)a \:表示在模式匹配到的行后面添加新内容;
i \:表示在模式匹配到的行前面添加新内容;
/n:实现添加多行。如下例所示:
[root@localhost ~]# sed '/#/a \ This is a comment line.\nIt can be ignore.' test.sh
#!/bin/bash
This is a comment line.
It can be ignore.
#
This is a comment line.
It can be ignore.
JUSER() {
if id -u root &> /dev/null;then
echo "Exists"
else
echo "No this user."
fi
}
JUSER &> /dev/null
echo $?
这表示在#行的后面加上两行文字,如果将a换成i则表示在#行的前面添加文字。
注意:sed '/#/!i \ This is a comment line.\nIt can be ignore.' test.sh,如果在i前面加!表示对除了匹配到的行的其他行的前面添加以上两行。这样大家基本明白了a,i命令的使用方法了吧。
(3)r FILE:表示读取某一个文件。例如:
root@localhost ~]# sed '2r c.txt' c.sh #表示在c.sh的第二行添加c.txt的内容。
#!/bin/bash
#
This is my first lesson.
Think you!
line 1
line 2
line 3
[root@localhost ~]# sed '/^#/r c.txt' c.sh #表示在c.sh的#开头的行后面添加c.txt的内容。
#!/bin/bash
This is my first lesson.
Think you!
#
This is my first lesson.
Think you!
line 1
line 2
line 3
(4)w FILE: 可以将模式匹配到的行保存下来。例如:
root@localhost ~]# cat c.sh #显示c.sh中的内容
#!/bin/bash
#
line 1
line 2
line 3
[root@localhost ~]# sed -n '/^#/w cc.sh' c.sh #将c.sh文件中以#开头的行保存在cc.sh中
[root@localhost ~]# cat cc.sh #cc.sh的内容
#!/bin/bash
#
(5)s:s/PATTERN/string/[g|i] 表示搜索符号PATTERN的内容,将其替换为string。
g:表示将搜索到的内容全部替换。
i:表示将搜索到的内容忽略大小写。
如果PATTERN中含有与分隔符相同的字符时,可以将分隔符替换为其他符号。例如:s@PATTERN@string@[g|i]
范例如下:
[root@localhost ~]# cat test #显示test的内容
He love his love.
She like her like.
Dove love her like.
[root@localhost ~]# sed 's@\(l..e\)\.@\1r.@' test #在最后一个单词后面加r,注意第.
He love his lover. #前面要加转义字符\
She like her liker.
Dove love her liker.
[root@localhost ~]# sed 's@\<h\([[:alpha:]]*\)\>@H\1@g' test #将以h开头的单词替换
He love His love. #为以H开头
She like Her like.
Dove love Her like.
(6)n:以覆盖的方式读去下一行。
N:以追加的方式读取下一行。例如:
[root@localhost ~]# cat test #test中的内容
He love his love.
She like her like.
Dove love her like.
four line
[root@localhost ~]# sed -n 'n;p' test #使用n时的效果
She like her like.
four line
[root@localhost ~]# sed 'n;d' test #只显示偶数行。
He love his love.
Dove love her like.
[root@localhost ~]# sed -n 'N;p' test #使用N时的效果
He love his love.
She like her like.
Dove love her like.
four line
[root@localhost ~]# sed 'N;N;s@\n@ @g' test #表示将前三行合并为一行
He love his love. She like her like. Dove love her like.
four line
[root@localhost ~]# sed '/\.$/!N;s@\n@ @g;s/bad animal/BAD ANIMAL/g' test
He love his love.
She like her like.
Dove love her like.
four line Wendy is BAD ANIMAL.
Blair is a BAD ANIMAL.
这题目较复杂:(1)/\.s/!N:表示先搜索不已点号结尾的行,(2)s@\n@ @g:将搜索到的行去掉换行符 (3)将小写的bad animal 替换为BAD ANIMAL.
(7) h:将模式空间中的内容以覆盖的方式复制到保留空间。
H:将模式空间中的内容以追加的方式复制到保留空间。
g:将保留空间的内容以覆盖的方式复制到模式空间。
G:将保留空间的内容以追加的方式复制到模式空间。例如:
[root@localhost ~]# cat newfile #显示文件中的内容
line 1
line 2
line 3
[root@localhost ~]# sed -n 'h;n;G;h;n;G;p' newfile #将文件中的行倒序排列
line 3
line 2
line 1
(8)b:跳转,掠过符合条件的行。例如:
[root@localhost ~]# sed '1b;y/123/456/' newfile
line 1
line 5
line 6
此例表示:跳过第一行,将其他各行的123替换为456;其中y表示替换的意思。
b lable:表示跳转到某个位置。例如
[root@localhost ~]# cat newfile
line 1
line
line 3
line
[root@localhost ~]# sed '/.*[[:digit:]].*/b para;s/.*/% &/;:para;s/.*[0-9].*/# &/g' newfile
# line 1
% line
# line 3
% line
此例表示,将带数字的行前添加#,不带数字前添加%;定义para为跳转符。这个参数可以随意指定。
本文只是对sed的一些常用命令和选项做介绍,其余命令可查看帮助手册。谢谢!
[转]sed常用命令总结的更多相关文章
- sed 常用命令 网址
https://wangchujiang.com/linux-command/c/sed.html https://linux.cn/article-11367-1.html https://juej ...
- sed常用命令
sed也是一个管道命令. sed [-nefr] [动作] -n 加上-n参数后,只有经过sed特殊处理的那些行才会被列出来 -e 直接在命令行模式进行sed的动作编辑 -i 直接修改读取的文件内容 ...
- 23、sed常用命令
1.匹配与不匹配: n p ! sed -n '/ATTGC/p' file1 ##-n打印匹配到的行输出,默认所有行输出. sed -n '/AT\|GC/p' fil ...
- akw、grep、sed常用命令
awk 求和 cat data|awk '{sum+=$1} END {print "Sum = ", sum}' 平均值 cat data|awk '{sum+=$1} END ...
- sed 常用命令
删除以ifeq开头的行 sed -i "/^ifeq/d" file 删除空行 sed -i '/^$/d' file
- grep,awk和sed的常用命令和语法
Grep的常用命令语法 1. 双引号引用和单引号引用在g r e p命令中输入字符串参数时,最好将其用双引号括起来.例如:“m y s t r i n g”.这样做有两个原因,一是以防被误解为 s h ...
- Linux常用命令之sed(2)
Sed SED的英文全称是 Stream EDitor,它是一个简单而强大的文本解析转换工具,在1973-1974年期间由贝尔实验室的Lee E. McMahon开发,今天,它已经运行在所有的主流操作 ...
- shell常用命令归类整理
shell 命令整理 bash shell 含有许多功能,因此有许多可用的命令:本文档仅罗列了一些常用命令及其使用频率较高的参数.#本文档仅罗列了一些常用命令及其使用频率较高的参数.#vers ...
- Liunx 常用命令
Liunx 常用命令================================================================================ 1. 远程拷贝文件 ...
随机推荐
- 1289大鱼吃小鱼(STL中栈的应用)
>>点击进入测试<< 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向 ...
- 【Codeforces 1102E】Monotonic Renumeration
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 会发现如果a[i]=a[j] 那么b[i]~b[j]都是相同的,等于b[i] 而b[i]等于b[i-1]+1或者b[i] 有两种可能 所以对于 ...
- [luoguP3565] [POI2014]HOT-Hotels(dfs)
传送门 三点在树上距离相等的情况只有一种,就是以某一个点为中心,三个点到这个点的距离相等. 所以直接枚举每个点作为中心,dfs这个中心的子树,根据乘法原理统计答案即可. 时间复杂度 O(n2) (n ...
- 我不喜欢的 Rust 特性 (之一) eager drop
struct Foo; impl Drop for Foo { fn drop(&mut self) { println!("drop"); } } fn main() { ...
- influxDB系列(二)--查看数据库的大小
google 搜索了好多文档,终于发现了这个靠谱的回答. https://groups.google.com/forum/#!topic/influxdb/I5eady_Ta5Y You can se ...
- Spring注解配置定时任务<task:annotation-driven/>
http://m.blog.csdn.net/article/details?id=50945311 首先在配置文件头部的必须要有: xmlns:task="http://www.sprin ...
- 重啓ubuntu后 VNC 自動運行
Vino-Server是Ubuntu自带的有個缺点:重启后不能自動運行(可能是基於安全吧!) 親身測試对象:windows & ubuntu 10.04已安装图形桌面gnome ***wind ...
- hdu 3555 Bomb 【数位DP】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题意:上一题是不要62 这个是"不要49" 代码: #include < ...
- Android天气预报+百度天气接口
首先 在准备编敲代码之前有几点准备工作 1首先须要调节Android的DNS地址. (这个我会在末尾提及) http://www.eoeandroid.com/forum.php? mod=viewt ...
- jstl自己定义函数的使用
因为本人之前并没有接触过jstl标签,说来也可笑,之前一直使用struts2标签.近期项目用到jstl,所以做些记录方便以后自己查看. jstl的强大原因之中的一个我觉得就是他的自己定义函数,我们能够 ...