sed 基本使用

写在前面

本篇是个人学习整理笔记而得。
原书:Sed and Awk 101 Hacks -中文版
引用书结尾的一句话:
Knowledge is not one man’s Entity

sed 基本使用

1. 项目列表 执行多条指令

sed -n -e'/^root/p' -e'/^nobody/p' /etc/passwd
sed -n '{/^root/p/^nobody/p}' /etc/passwd

2. sed的执行流程

Sed 脚本执行遵从下面简单易记的顺序:Read,Execute,Print,Repeat(读取,执行,打印,重复),简称 REPR
分析脚本执行顺序:

  • 读取一行到模式空间(sed 内部的一个临时缓存,用于存放读取到的内容)。
  • 在模式空间中执行命令。如果使用了{ } 或 --e 指定了多个命令,sed 将依次执行每个命令。
  • 打印模式空间的内容,然后清空模式空间。
  • 重复上述过程,直到文件结束。

3. 打印模式空间

### 打印所有
sed -n 'p' employee.txt 

### 打印指定一行
sed -n '2 p' employee.txt 

### 打印指定几行
sed -n '1,3 p' employee.txt 

### 打印指定行到结尾
sed -n '4,$ p' employee.txt

4. 删除行

用法和打印行基本一致,匹配需要删除的行,使用删除命令 "d"

### 删除所有空行
sed '/^$/d' employee.txt

### 删除所有注释行(假定注释行以#开头)
sed '/^#/d' employee.txt

### 注意:如果有多个命令,sed 遇到命令 d 时,会删除匹配到的整行数据,其余的命令将无法操作被删除的行。

5. 模式空间输出到文件

用法和打印行基本一致,匹配需要删除的行,使用删除命令 "w"

### 将 2-3 行输出到 output.tmp 文件
sed -n '2,3 w output.tmp' employee.txt 

6. 替换

### 替换所有行
sed 's/Manager/Diractor/' employee.txt

### 替换匹配到Sales的行
sed '/Sales/s/Manager/Diractor/' employee.txt 

### 默认情况下,sed会替换一行中第一次匹配到的字符串
sed 's/a/A/' employee.txt

### 使用全局标志g,可以替换所有出现的字符串
sed 's/a/A/g' employee.txt

### 使用数字标志,可以只替换每行第n次字符串的出现
sed 's/a/A/2' employee.txt

### 打印标志p,配合-n s一起使用,只显示被替换的行
sed -n 's/locate/find/2 p' sl-test.txt

### 替换后写标志w
sed 's/locate/find/2 w output.tmp' sl-test.txt

### 忽略大小写标志i
sed -n 's/john/Johnny/i p' employee.txt

### 执行命令标志e
# 可以将模式空间的内容作为shell命令执行彬返回结果到模式空间
cat files.txt 
/etc/passwd
/etc/group
sed 's/^/ls -l /e' files.txt 
-rw-r--r--. 1 root root 1775 6月  12 16:39 /etc/passwd
-rw-r--r--. 1 root root 873 6月  12 16:39 /etc/group

### 标志组合
sed -n 's/manager/Director/igpw output.tmp' employee.txt 

### 替换模式的分隔符
# 可以使用任意的字符作为sed替换命令的分界符
sed 's/\/usr\/local\/bin/\/usr\/bin/' path.txt
# 等价于
sed 's@/usr/local/bin@/usr/bin@' path.txt
sed 's!/usr/local/bin!/usr/bin!'  path.txt

### & 的作用——获取匹配到模式
sed 's/^[0-9][0-9][0-9]/[&]/' employee.txt

### 分组以 \( 开始,以 \) 结束单个分组:
sed 's/\([^,]*\).*/\1/g' employee.txt
### 上面例子中:
# 正则表达式\([^,]*\)匹配字符串从开头到第一个逗号之间的所有字符(并将其放入第一个分组中)
# replacement-string 中的\1 将替代匹配到的分组
# g 即是全局标志

### 分组替换(多个分组)
sed 's/^\([^,]*\),\([^,]*\),\([^,]*\)/\1,\3/' employee.txt

### 使用 sed 可以把 DOS 的换行符(CR/LF)替换为 Unix 格式。当把 DOS 格式的文件拷到 Unix 上,你会发现,每行结尾都有\r\n .
# 使用 sed 把 DOS  格式的文件转换为 Unix  格式:
sed 's/.$//' filename

7. sed脚本

### 可以重复使用一组sed语句
cat run.sed 
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1, \3/g
s/^.*/<&>/
s/Developer/IT Manager/
s/Manager/Director/
sed -f run.sed employee.txt 
<John Doe,101, CEO>
<Jason Smith,102, IT Director>
<Raj Reddy,103, Sysadmin>
<Anand Ram,104, IT Director>
<Jane Miller,105, Sales Director>

### 用做命令解释器
cat run.sed 
#!/bin/sed -f
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1,\3/g
s/^.*/<&>/
s/Developer/IT Manager/
s/Manager/Director/
./run.sed employee.txt 
<John Doe,101, CEO>
<Jason Smith,102, IT Director>
<Raj Reddy,103, Sysadmin>
<Anand Ram,104, IT Director>
<Jane Miller,105, Sales Director>

### 屏蔽默认输出-nf
cat test.sed 
#!/bin/sed -nf
/root/p
/nobody/p
/mail/p
/mail/p

8. 修改文件

### 常用重定向和w命令
sed 's/John/Johnny/' employee.txt > new-employee.txt
sed 's/John/Johnny/w new-employee.txt' employee.txt

### 使用-i命令,会直接修改原文件# 可以使用{-i + 扩展名}来备份原文件
sed -i.bak 's/John/Johnny/' employee.txt

### 上边语句等价于-i的全名–in-place
sed –in-place=.bak 's/John/Johnny/' employee.txt
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容