sed 通常用于过滤文本,即它接受文本输入,对其执行一些操作(或一组操作),然后输出修改后的文本。sed 通常用于使用模式匹配或替换文件中多次出现的字符串来提取文件的一部分。

Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

使用场景

我就讲讲我本来的使用场景,我使用最多的场景就是编写shell脚本时会用到。使用sed可以自动化的编辑一些文本文件。

官方帮助文档

https://www.gnu.org/software/sed/manual/sed.html

语法

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明:

  • -e<script>--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h或–help 显示帮助。
  • -n或–quiet或–silent 仅显示script处理后的结果。
  • -V或–version 显示版本信息。

动作说明:

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

示例

ubuntu切换国内的源

一般情况下,将 /etc/apt/sources.list 文件中 Ubuntu 默认的源地址 http://archive.ubuntu.com/ 替换为 http://mirrors.ustc.edu.cn/ 即可。
如果手动编辑,要输入很多指令,还会出错操作失误。

使用sed一行命令就可以实现了。

sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

这样就非常的方便。

删除文件中的第 4 行

sed '4d' input.txt > output.txt

在第 10-20 行将所有出现的 ‘hello’ 替换为 ‘world’

sed '10,20s/hello/world/' input.txt > output.txt

仅打印输入文件的第 45 行

sed -n '45p' file.txt

多个文件拼在一起输出1到20行

sed -n '1,20p' one.txt two.txt three.txt

输入指定字符结尾的行

sed -n '/bash$/p' /etc/passwd

Id删了指定字符结尾的行

input.txt内容如下;

boy
dog
girl
phone
age
sed '/dog$/Id' input.txt

删除命令: Id

i指定位置插入文本

input.txt内容如下;

a
b
c

要在b上面一行加个java

sed '/b/ijava' input.txt

a
java
b
c
基中i为插入指令java是插入的值

c将第 2 到第 9 行替换为单词 ‘hello’

seq 10 | sed '2,9c hello'
1
hello
10

命令c替换文本

整段文本的处理

处理段落等文本块(而不是逐行)的常用技术是使用以下构造:

sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/'

第一个表达式/./{H;$!d}对所有非空行进行操作,并将当前行(在模式空间中)添加到保持空间。在除最后一行之外的所有行上,模式空间都被删除并重新开始循环。
其他表达式x和s仅在空行(即段落分隔符)上执行。该x命令将累积的行从保持空间取回模式空间。然后该 s///命令对段落中的所有文本(包括嵌入的换行符)进行操作。
示例:

$ cat input.txt
a a a aa aaa
aaaa aaaa aa
aaaa aaa aaabbbb bbb bbb
bb bb bbb bb
bbbbbbbb bbbccc ccc cccc
cccc ccccc c
cc cc cc cc$ sed '/./{H;$!d} ; x ; s/^/\nSTART-->/ ; s/$/\n<--END/' input.txtSTART-->
a a a aa aaa
aaaa aaaa aa
aaaa aaa aaa
<--ENDSTART-->
bbbb bbb bbb
bb bb bbb bb
bbbbbbbb bbb
<--ENDSTART-->
ccc ccc cccc
cccc ccccc c
cc cc cc cc
<--END

原文:
https://www.gnu.org/software/sed/manual/sed.html#Multiline-techniques

shell配合sed实现整段文本替换实例

写本文的原始需求:
需要修改一个非常长的Java文件,以下代码块

 @SuppressLint("AddJavascriptInterface")public void setMessagingEnabled(boolean enabled) {if (messagingEnabled == enabled) {return;}messagingEnabled = enabled;if (enabled) {addJavascriptInterface(createRNCWebViewBridge(this), JAVASCRIPT_INTERFACE);} else {removeJavascriptInterface(JAVASCRIPT_INTERFACE);}}

替换成:

    @SuppressLint("AddJavascriptInterface")public void setMessagingEnabled(boolean enabled) {//webview removeJavascriptInterfaceremoveJavascriptInterface("searchBoxJavaBridge_");removeJavascriptInterface(accessibility);removeJavascriptInterface(accessibilityTraversal);}

原本我想使用Java代码代码来实现替换动作,或者使用lua脚本来实现这个事情。
考虑到这两种方式都是需要安装运行环境的。所以我就想能不能使用兼容性相对比较好的shell来实现。
就想到使用sed命令来实现了。
最终功能已经成功实现了,代码写的比较笨拙,仅供大家参考:

#!/bin/bash
#自动修改React Native Webview中的代码
#editFilePath='input.txt1'
editFilePath='../node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java
'
#获取要修改的行号
setMessagingEnabledLine=$(sed -n '/public void setMessagingEnabled(boolean enabled) {$/=' ${editFilePath})
echo "查询关键字的位置:${setMessagingEnabledLine}"
if [[ "$setMessagingEnabledLine" == '' ]]; thenecho "没有找到关键字,程序将要退出"echo "可能已经执行过 自动修改脚本了"exit
fi#要修改的开始行号
startLine="$((setMessagingEnabledLine+1))"
#要修改的结束行号
endLine="$((startLine+10))"
index1="$((startLine-1))"
index2="$((startLine))"
index3="$((startLine+1))"
#删除方法体的内容
sed -i "${startLine},${endLine}d" ${editFilePath}
#增加第一行代码___用于格式化
sed -i "${index1}a________removeJavascriptInterface(\"searchBoxJavaBridge_\");" ${editFilePath}
#增加第二行代码
sed -i "${index2}a________removeJavascriptInterface("accessibility");" ${editFilePath}
#增加第三行代码
sed -i "${index3}a________removeJavascriptInterface("accessibilityTraversal");"  ${editFilePath}
#用空格格式化一下
sed -i 's/________/        /' ${editFilePath}
#标记位做个标记访问重复处理
sed -i 's/public void setMessagingEnabled(boolean enabled) {$/public void setMessagingEnabled(boolean enabled) {\/\/webview removeJavascriptInterface/' ${editFilePath}
cat ${editFilePath}

兼容macOS与linux的方案

很遗憾有些命令在linux中运行正常,而放到macOS中执行就无法正常运行了。
比如:

sed -i "1,19d"  test.java

以上命令在Linux下是正常运行的,而在macOS中就不行了。报错如下:

sed -i "1,19d"  test.java
sed: 1: "test.java": undefined label 'est.java'

解决办法:

sed -i.bak -e "1,19d"  test.java

这样写就不报错了,但是修改文件后会自动备份文件。
如果不想生成备份文件,可以这样:

sed -i.bak -e "1,19d"  test.java && rm test.java.bak

这样会显的比较繁琐,但至少可以兼容两种系统。

相关阅读:
https://unix.stackexchange.com/questions/13711/differences-between-sed-on-mac-osx-and-other-standard-sed

第二种解决方案
调整mac下sed的用法,使其与linux一致
mac上安装gnu-sed

brew install gnu-sed
alias sed=gsed

调整后两系统下sed的用法完全一致。
链接:https://www.jianshu.com/p/87a57a12d5e6

参考

https://www.runoob.com/linux/linux-comm-sed.html

https://www.gnu.org/software/sed/

https://www.gnu.org/software/sed/manual/sed.html
《Mac OSX 上的 sed 与其他“标准”sed 之间的区别?》
https://unix.stackexchange.com/questions/13711/differences-between-sed-on-mac-osx-and-other-standard-sed
《mac上遇到的错误sed command a expects followed by text》
https://www.jianshu.com/p/87a57a12d5e6

Linux sed命令使用笔记相关推荐

  1. linux sed命令,如何替换换行符“\n”

    linux sed命令如何替换换行符n     实现方法         第一种方法使用test跳转命令实现替换换行符         branch和test区别         第二种方法使用bra ...

  2. linux a文本编辑大全,Linux sed 命令 - Linux文档编辑命令大全

    Linux sed 命令是利用脚本来处理文本文件. sed 可依照脚本的指令来处理.编辑文本文件. Sed 主要用来自动编辑一个或多个文件.简化对文件的反复操作.编写转换程序等. 语法sed [-hn ...

  3. linux sed p变量,Linux sed 命令详解系列教程之各种问题解决

    本文目录: 1 sed中使用变量和变量替换的问题 2 反向引用失效问题 3 "-i"选项的文件保存问题 4 贪婪匹配问题 5 sed命令"a"和"N& ...

  4. linux的sed命令是什么,linux sed命令

    linux sed命令 简介: sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令 ...

  5. Linux sed命令高级用法精讲

    <Linux sed用法详解>一节给大家介绍了如何用 sed 命令的基本功能处理文本中的数据,所涵盖的知识点,可以满足日常大多数文本编辑需求.本节将介绍 sed 提供的一些高级功能,这些功 ...

  6. Linux sed命令完全攻略(超级详细)

    我们知道,Vim 采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入.删除或替换数据中的文本.但本节要讲的 sed 命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需 ...

  7. linux基础命令学习笔记(二)

    linux基础命令学习笔记(二) 1.kill :终止进程  kill pid (唯一标示一个进程) kill -9  强制终止  kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...

  8. linux系统sed语法,22. Linux sed命令

    Linux sed命令是利用script来处理文本文件. sed可依照script的指令,来处理.编辑文本文件. Sed主要用来自动编辑一个或多个文件:简化对文件的反复操作:编写转换程序等. sed ...

  9. linux sed命令_Linux sed命令用法与示例

    linux sed命令 Sed, short for Stream EDitor, is a command that is used to perform text transformations ...

最新文章

  1. 利用存储过程来实现分页性能比较
  2. 海康摄像头取、录像机RTSP视频流的字串格式
  3. [JavaWeb基础] 025.JAVA把word转换成html
  4. 转载:谢谢原作者:块设备驱动实战基础篇一 (170行代码构建一个逻辑块设备驱动)
  5. ASP.NET MVC: 使用自定义 ModelBinder 过滤敏感信息
  6. [转]在WPF中自定义控件 UserControl
  7. angular.js的路由和模板在asp.net mvc 中的使用
  8. 博客园是否提供trackback的rss
  9. CxImage图像库的使用
  10. 《程序员代码面试指南》题目与题解列表
  11. 同济版《线性代数》再遭口诛笔伐,网友:它真的不太行...
  12. html吃豆豆游戏代码,吃豆豆小游戏
  13. JavaScript入门一(JS基础知识)
  14. MFC学习日记五:Mfc文本编程
  15. inaturalist昆虫数据集
  16. 两查一信热战正酣、可信百科低调入局,企业征信是虚火吗?
  17. 快递物流管理系统的设计与实现(SSM,MySQL)
  18. 股票信息东方财富网爬数据
  19. mysql职业生涯规划书_计算机应用职业生涯规划书.pdf
  20. 第一个算出地球周长的人

热门文章

  1. 微信小程序之 var和let区别
  2. 设计模式之简单工厂模式(Simple Factory Pattern)
  3. 同期群分析到底是怎么一回事?有哪些商业应用?
  4. 微信塔防小游戏开发教程,唤境引擎制作塔防游戏分享
  5. vs旗舰版安装包下载地址
  6. 基于时间的访问控制列表ACL
  7. 浪潮之巅第二章 — 蓝色巨人(IBM)
  8. Type Hints 入门教程,让代码更加规范整洁
  9. SQL性能优化第一篇之分页数据与Count数据一次性获取
  10. 华为鸿蒙不用了,不用华为鸿蒙就该骂?中兴的遭遇,敲响了一个警钟