草庐IT

sed用法

tushanbu 2023-03-28 原文

sed用法


基础sed命令

sed命令的基本语法

sed OPTIONS… [SCRIPT] [INPUTFILE…]

常用的选项:

-n,–quiet: 不输出模式空间中的内容

-i: 直接编辑原文件,默认不对原文件进行操作

-e: 可以使用多个命令(脚本)进行操作

-f /path/from/sed_script: 从指定的文本中读取处理脚本

-r: 使用扩展正则表达式

sed命令选项

替换标记
g:表示行内全面替换
w:表示把行写入一个文件
x:表示互换模式空间的文本和保持空间的文本
y:表示把一个字符翻译为另外的字符(不用于正则表达式)
单行模式空间
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

d :删除,因为是删除,所以 d 后面通常不接任何东西;

i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p :打印,即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行

s :取代,通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g

n:读取下一个输入行, 用下一个命令处理新的行

y:把一个或多个字符替换成另一个字符
a的用法

[root@localhost ~]# vim xbz
[root@localhost ~]# cat xbz
a b c
d
c
b
a
[root@localhost ~]# sed '3abbxxxx' xbz //在第三行下面(第四行)进行新增
a b c
d
c
bbxxxx
b
a
[root@localhost ~]# sed '/c/abbxxxx' xbz  //在匹配的参数(c)下一行进行添加
a b c
bbxxxx
d
c
bbxxxx
b
a

c的用法


[root@localhost ~]# cat xbz 
a b c
d
c
b
a
[root@localhost ~]# sed '2cxxb' xbz //取代第二行
a b c
xxb
c
b
a
[root@localhost ~]# cat xbz 
a b c
d
c
b
a

[root@localhost ~]# sed '/d/caa' xbz  //在匹配的参数(d)进行取代
a b c
aa
c
b
a

d的用法

root@localhost ~]# cat xbz 
a b c
d
c
b
a

[root@localhost ~]# sed '1d' xbz //删除第一行
d
c
b
a

[root@localhost ~]# cat xbz 
a b c
d
c
b
a

[root@localhost ~]# sed '/c/d' xbz //在匹配的参数(c)进行整行删除
d
b
a

i的用法

[root@localhost ~]# cat xbz 
a b c
d
c
b
a

[root@localhost ~]# sed '2i3838' xbz  //在第二行进行插入
a b c
3838
d
c
b
a

[root@localhost ~]# cat xbz 
a b c
d
c
b
a

[root@localhost ~]# sed '/c/i6868' xbz //在匹配的参数(c)那一行进行插入
6868
a b c
d
6868
c
b
a

p的用法

[root@localhost ~]# cat xbz 
a b c
d
c
b
a

[root@localhost ~]# sed -n '/b/p' xbz //-n选项:只显示匹配处理的行(否则会输出所有)(也就是关闭默认的输出),只是打印带b的行
a b c
b

s的用法

[root@localhost ~]# cat xbz 
a b c
d
c
bbb
a

[root@localhost ~]# sed 's/b/a/' xbz //将匹配的参数(b)每行里的第一个参数进行替换
a a c
d
c
abb
a
[root@localhost ~]# cat xbz 
a b c
d
c
bbb
a

[root@localhost ~]# sed 's/b/a/g' xbz //在上面的基础是加上g就可以全部进行替换
a a c
d
c
aaa
a

n的用法
此处的n不是sed -n的n的那种用法,是n读取下一个输入行

[root@localhost ~]# cat xbz 
a b c
d
c
bbb
a

[root@localhost ~]# sed -n '/a/n;p' xbz //匹配到的参数(a)下面的所有行
d
c
bbb


y的用法

[root@localhost ~]# cat xbz 
a b c
d
c
bbb
a
[root@localhost ~]# sed '3y/c/C/' xbz //将匹配到的第三行小写c改为大写C
a b c
d
C
bbb
a

高阶sed命令

模式空间与保持空间

模拟空间:
当前处理输出的缓冲空间,因为sed就是一次处理一行的内容,就会把这一行的内容提取到模式空间,然后用sed命令处理这一行的内容,处理完成后输出到屏幕,接着处理下一行 的内容
保持空间:
保持空间就是sed的另一个缓冲区,此缓冲区如其名,不会自动清空内容,也不会把缓冲区的内容打印到的标准输出中
模式空间与保持空间的关系
模式空间:相当于流水线,文本行再模式空间中进行处理;
保持空间:相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。可以使用高级命令h,H,g,G与模式空间进行交互。

sed命令选项

多行空间模式
N:读取匹配到的行的下一行追加至模式空间
P:打印模式空间开端至\n内容,并追加到默认输出之前
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环
N追加下一行

[root@localhost ~]# cat xbz.txt 
Consult Section 3.1 in the Owner and Operator
Guide for a description of the tape drives
available on your system.
[root@localhost ~]# sed -n '/Operator$/{N;p}' xbz.txt 
Consult Section 3.1 in the Owner and Operator
Guide for a description of the tape drives
[root@localhost ~]# sed -n '/Operator$/{N;s/Owner and Operator\nGuide/installation Guide/g;p}' xbz.txt 
Consult Section 3.1 in the installation Guide for a description of the tape drives
[root@localhost ~]# sed '/Operator$/{N;s/Owner and Operator\nGuide/installation Guide/g}' xbz.txt 
Consult Section 3.1 in the installation Guide for a description of the tape drives
available on your system.
//我们假设想要将“Owner and 0perator Guide”换成“lnstallation Guide”,但是我们发现它出现在文件中的两行上,“Operator”和“Guide”被分开了。
Owner and Operator Guide 换成 installation Guide
空格用\n

D多行删除

[root@localhost ~]# cat test

This is the header line.
This is a data line.

This is the last line.
[root@localhost ~]# sed '/^$/{N ; /header/D}' test //删除模式空间的第一行
This is the header line.
This is a data line.

This is the last line.

P多行打印

[root@localhost ~]# cat xxb 
Here are examples of the UNIX
System. Where UNIX
System appears, it should be the UNIX
Operating System.
[root@localhost ~]# sed -n '/UNIX$/p' xxb 
Here are examples of the UNIX
System. Where UNIX
System appears, it should be the UNIX
[root@localhost ~]# sed -n '/UNIX$/{N;p}' xxb 
Here are examples of the UNIX
System. Where UNIX
System appears, it should be the UNIX
Operating System.
[root@localhost ~]# sed -n '/UNIX$/{N;/\nSystem/{p}}' xxb
Here are examples of the UNIX
System. Where UNIX
[root@localhost ~]# sed -n '/UNIX$/{N;/\nSystem/{s// Operating &/g;p}}' xxb
Here are examples of the UNIX Operating 
System. Where UNIX
[root@localhost ~]# sed -n '/UNIX$/{N;/\nSystem/{s// Operating &/g;P;D;p}}' xxb
Here are examples of the UNIX Operating 
System. Where UNIX Operating 

保持空间

命令 缩写 功能
Hold h(复制)或H (追加) 上传 将模式空间的内容复制或追加到保持空间
Get g或G下载 将保持空间的内容复制或追加到模式空间
Exchange x 交换保持空间和模式空间的内容
[root@localhost ~]# cat abc
1
2
11
22
111
222
[root@localhost ~]# sed '/1/{h;d};/2/G' abc //匹配1将内容放入保持空间,删除,在将匹配2的内容追加模式空间
2
1
22
11
222
111

有关sed用法的更多相关文章

  1. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  2. ruby - 使用法拉第上传文件 - 2

    我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>

  3. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  4. 【ChatGPT】ChatGPT 的 N 种用法 - 2

    目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans

  5. ruby - 是否有 Rack::Session::Cookie 用法的基本示例? - 2

    我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=

  6. ruby - Ruby 方法的双冒号(双列或::)语法的惯用用法 - 2

    我是Ruby的新手,发现以下几对令人困惑示例同样有效:File.included_modulesFile::included_modulesFile.stat('mbox')#Returnsa'#'objectFile::stat('mbox')File.new("foo.txt","w")File::new("foo.txt","w")"asdf".size#Aninstancemethod"asdf"::size2+32::send(:+,3)#AnextremeexampleFile::new,尤其是我经常遇到的东西。我的问题:如果我永远避免使用::运算符来限定除类、模块和常量之

  7. ruby-on-rails - 如果只有一个存在,是否有用于返回第一个数组元素的 ruby​​ 习惯用法? - 2

    如果数组只包含一个值,我想返回数组的第一个元素。目前,我使用:vals.one??vals.first:vals.presence因此:vals=[];vals.one??vals.first:vals.presence#=>nilvals=[2];vals.one??vals.first:vals.presence#=>2vals=[2,'Z'];vals.one??vals.first:vals.presence#=>[2,"Z"]是否有内置的东西可以做到这一点,或者是否有更好的设计考虑?我的用例是特定的,涉及知道从方法(将实现上述代码)中期望什么的演示者。如果这些演示者将所有返回

  8. ruby - 这是 &&= 在 Ruby 中的合理用法吗? - 2

    在SOquestion2068165一个答案提出了使用这样的东西的想法:params[:task][:completed_at]&&=Time.parse(params[:task][:completed_at])作为DRYer的说法params[:task][:completed_at]=Time.parse(params[:task][:completed_at])ifparams[:task][:completed_at]paramsHash将来自(Rails/ActionView)表单。这是众所周知的||=习语的一种推论,如果LHS不是nil/false则设置值。像这样使用&&

  9. ruby - Head 用法未知选项 -1/-n 错误。可能与 ruby 有关 - 2

    我在OSX10.9.1中启动终端时反复出现问题。每次启动终端时,我都会重复以下至少30次Unknownoption:1Usage:head[-options]...-musemethodfortherequest(defaultis'HEAD')-fmakerequestevenifheadbelievesmethodisillegal-bUsethespecifiedURLasbase-tSettimeoutvalue-iSettheIf-Modified-Sinceheaderontherequest-cusethiscontent-typeforPOST,PUT,CHECKIN-

  10. ruby-on-rails - rails 中是否内置了对默认值替换习惯用法的支持? - 2

    我经常编写代码以在遇到nil/空值时提供默认值。例如:category=order.category||"Any"#ORcategory=order.category.empty??"Any":order.category我即将扩展try方法来处理这个习语。category=order.try(:category,:on_nill=>"Any")#ORcategory=order.try(:category,:on_empty=>"Any")我想知道Rails/Ruby是否有一些方法来处理这个习惯用法?注意:我正在尝试消除||的重复/或/?基于运算符的习语。本质上,我正在寻找与try方

随机推荐