shell脚本 文件内容查找和替换 学习实践

不是系统的学习,只是学习一下常用的命令,理解可能有错误,如果有路过的大神能够补充和指正,万分感谢!

1.根据文件名查找文件

1.1利用find命令

find [path] -type f -name '[filename]' ! -path "[excludepath]"

path目录及子目录中寻找名字为filename的文件,并打印。[path]为空的时候查找当前目录及当前目录子目录下所有名字为filename的文件,忽略excludepath目录及其子目录下的结果。例如:

//查找当前目录及子目录下的所有.sh文件并打印
$ find . -name '*.sh' 
//查找catkin_ws目录及子目录下所有名为‘main.cpp’的文件并打印
$ find ~/catkin_ws -name 'main.cpp' 

查找catkin_ws目录及子目录下所有名为‘main.cpp’的文件并打印

1.2利用grep命令

有空总结

2.文件内容查找和替换

https://blog.csdn.net/xiexingshishu/article/details/50514132

2.1 文件内容查找

2.1.1利用sed命令

sed -n '/[text]/p' [filename]

filename文件中查找text并将所在行打印出来。
例如:

//在当前目录下asdf.aaa文件中查找'ff'字符串并打印所在行
$ sed -n '/ff/p' ./asdf.aaa
asdfasdff
ff1

2.1.2利用grep命令

grep查找文件内容指南有空再总结

grep [text] [filename]

filename中查找text并打印,例如

//在aaa.aaa文件中查找aaa并打印所在行
grep aaa aaa.aaa
//在aaa.aaa文件中查找aaa(忽略大小写)并打印所在行
grep -i 5 Aaa aaa.aaa
//打印本行及以下5行
grep -A 5 aaa aaa.aaa
//打印本行及以上5行
grep -B 5 aaa aaa.aaa
//打印本行及上下5行
grep -C 5 aaa aaa.aaa

2.2 文件内容替换

sed -i 's/[old]/[new]/g' [filename]

filename文件中查找old字符串并将其替换为new字符串
例如:

//将asdf.aaa中的ff替换为gg
$ sed -i 's/ff/gg/g' asdf.aaa
//在asdf.aa中查找ff,无结果
$ sed -n '/ff/p' asdf.aaa
//在asdf.aaa中查找gg,发现2.1中两行中的ff已经变成gg
$ sed -n '/gg/p' asdf.aaa
asdfasdgg
gg1

3.在指定文件中查找内容和替换

结合上文中提到的文件名查找和文件内容查找和替换,通过管道符|xargs(可以将管道数据转换成命令行参数)命令,将find命令的输出作为sed的命令行参数,完成指定文件中内容查找和替换的工作。

find [path] -name '[filename]' | xargs sed -n '[text]'

path下查找filename文件,并在这些文件中查找包含text的行并打印

find [path] -name '[filename]' | xargs sed -i 's/[old]/[new]/g'

path下查找filename文件,并将这些文件中old的字符串替换为new
提示:/等符号需要转义符
例如:

//查找当前目录及子目录中的.launch文件,并将其中包含/robots/字符串的行打印出来
find . -name '*.launch' | xargs sed -n '/\/robots\//p'
//查找当前目录及子目录中的.launch文件,并将其中包含/robots/的字符串替换为/urdf/
find . -name '*.launch' | xargs sed -i 's/\/robots\//\/urdf\//g'

4.将内容另一个文件的指定行后面

4.1 直接插入

sed -i '/[insert_position]/a[insert_text]' [filename]

insert_text插入到filename文件中insert_position的下一行,其中插入到下一行是由/a决定的,/a后面再加一个反斜杠\好像也没什么影响,但是看起来能清楚一些。秉持着能用就行的态度,不去追究太深。如果要插入多行的文字,就在换行时加个\n就好。举个栗子:

//在aaa.aaa文件中的aaa111所在行的下一行插入bbb222和ccc333
sed -i '/aaa111/abbb222\nccc333' aaa.aaa

4.2 将文件内容插入另一个文件的指定行后面

这里多说两句,这个问题的实际应用场景就是同事用Solidworks导出的URDF模型需要仿真,我需要将一些模型插入他的urdf里,上面4.1的方法就很麻烦了。

sed -i '[行号]r 内容所在的文件' [要被插入内容的文件]

例如:

//讲bbb.bbb的内容插入在aaa.aaa的第三行后面
sed -i '3r bbb.bbb' aaa.aaa

5.实现if判断执行

5.1 if的语法

关于shell中if使用的很全的参考链接

//一般模式
if [ condition ]; then
  //command
fi

注意在[后面和]前面都必须要有空格,其他注意事项见上面的链接

5.2实现根据文本内容是否存在判断是否执行插入文本命令

这里承接4中的文件文本插入,需要先判断之前是否插入过,如果已经执行过插入文本的操作就不要再次执行。因为sed和awk命令无论是否检索到要求的值,返回值都为0,所以命令不能够作为逻辑判断的条件,遂使用2.1.2中的grep命令。
grep命令返回值:0成功,1规则未找到,2文件未找到
可使用#?获取上一条命令的返回值,作为判断条件
例如:

#[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
#[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
grep aaa111 aaa.aaa
#判断上一条的返回值是否为0
if [ $? -eq 0 ]; then
  echo "aaa111 found"
fi

最后完成任务的成品脚本为

#!/bin/sh
#设定变量var=elevator11
var='elevator11'
#进入目录
cd ~/catkin_ws/src/$var
#在.launch文件中查找'/robots'并替换为'/urdf/'
find . -name '*.launch' | xargs sed -i 's/\/robots\//\/urdf\//g'
#在package.xml文件中查找'me2email'并替换为'me@email'
find . -name 'package.xml' | xargs sed -i 's/me2email/me@email/g'
#在.launch文件中查找'elevator11/urdf.rviz'替换为'/home/xcy/tree.rviz'
find . -name '*.launch' | xargs sed -i 's/$(find "$var")\/urdf.rviz/\/home\/xcy\/tree.rviz/g'
#在elevator11.urdf中查找字符串'world'
grep world urdf/$var.urdf
#如果不存在,则插入文件中的内容
if [ $? -ne 0 ]; then
sed -i '2r /home/xcy/world.urdf' urdf/$var.urdf
fi
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介 《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本实例。主要内容包括如何使小到中型的系统管理任务自动化,分析系统数据并编辑配置文件,使用bash和ksh等编写IAnux、Unix和OSX应用程序的脚本文件等。 《Shell脚本专家指南》面向中高级的shell程序员,以及需要解决日常问题的系统管理员,但假定读者能够读懂一般的shell代码。 编辑推荐 《Shell脚本专家指南》是我多年从事系统管理员一职所积累的非常有用的脚本和技术集合。尽管这些脚本是从一名系统管理员的角度进行编写的。但你几乎可以为任何你能想得到的目的而重用它们。《Shell脚本专家指南》中的所有代码或者是非常有用,或者是非常地独特(甚至可能会有一点与众不同)。不过其中有些解决方案所用到的技术可能是你自己很难想出来的。 当我还在学习shell脚本编程的时候,我会经常参考一些由别人编写出来的实例,以进一步地扩展自己的视野。而结果往往是我发现一些正在困扰着自己的问题,我的同事和朋友们却早已发明了又酷又聪明的解决方案。因此,我便萌生了写这《Shell脚本专家指南》的念头,以易于理解的形式,介绍所有这些关键技术。 我写此书的目的。不是为了创作出一本shelI脚本编程的入门书。而是希望能够提供一些更具深度的内容。它的作用不仅仅是解释sheIl代码的内容,更在于讲述在大多数情况下如何以及为何使用某种特定的编程逻辑。这些脚本将帮助你大大提高编程技能。并提高你解决问题和选择解决方案的能力。《Shell脚本专家指南》中的大部分脚本已经在以可靠性为关键因素的生产环境下,经历了多年的不断锤炼和改进。因此,《Shell脚本专家指南》对于那些希望在案头放一本案例精选的读者来说,将会是最佳的参考资料。 这里囊括了所有你迫切希望解决、却又无处发问的Shell脚本问题。 作者简介 作者:(美国)彼得(Ron Peters) 译者:李晓群 付弘宇 彼得(Ron Peters),在过去的15年中大部分时间都在做系统管理员的工作。他曾是Intel公司的高级管理员,在那些日子里,他总是每周7天、每天24小时不停地工作,他也曾是一个专用于设计工作的大型计算机集群的首席管理员。他现在是Columbia运动服装公司的LinuxRJNIx系统管理员。他喜欢和家人在一起,喜欢修理他的道奇Challenger汽车,还喜欢玩美式壁球。 目录 第1部分 基本脚本编程技术 第1章 shell脚本的错误检测 1.1 shell跟踪选项 1.2 简单输出语句 1.3 根据调试层次控制输出 1.4 用函数简化错误检查 1.5 手动单步执行 第2章 标准函数库 2.1 库文件 2.2 一些有用的函数 2.3 使用库 第3章 日期和时间操作 3.1 用天数来计算日期 3.1.1 自从纪元以来的天数 3.1.2 以秒计算日期的其他方法 3.2 评估当前日期和时间 第4章 比较和测试 比较的基本原理 第5章 接受命令行选项、开关和参数 第6章 测试变量和设置默认值 6.1 设置默认值 6.2 变量替换 6.2.1 :=句法 6.2.2 =句法 6.2.3 :-句法 6.2.4 -句法 6.2.5 :?句法 6.2.6 ?句法 6.2.7 :+句法 6.2.8 +句法 第7章 非直接引用变量 7.1 用非直接变量监控日志文件 7.2 主监控循环 第8章 shell进程树 8.1 用数组实现进程树 8.2 用非直接变量实现进程树 8.3 用Bourneshell实现进程树 第9章 数据重定向 9.1 避免错误 9.2 普通重定向 9.3 访问用户指定的文件句柄 9.4 从shell中访问描述符 第10章 管道输入读 10.1 逐行选项1 10.2 逐行选项2 10.3 逐行选项3 10.4 逐行选项4 10.5 直接管道读 10.6 逐字处理输入 第2部分 系统交互与高级技术 第11章 shell中的数学 11.1 expr 11.2 bc 11.3 de 第12章 cron 12.1 crontab条目 12.2 环境问题 12.3 输出重定向 第13章 自链接脚本 第14章 对并行进程的数量控制 14.1 用ksh实现并行进程 14.2 用bash实现并行进程 第15章 命令行编辑和历史命令 15.1 建立vi编辑环境 15.1.1 bash 15.1.2 ksh 15.2 命令和文件补全 第16章 从命令行编写脚本 例子 第17章 用expect实现用户输出自动化 17.1 为expect脚本定制参数的shell脚本 17.2 让telnet的expect脚本自动执行 第18章 用户输入超时 18.1 手动实现超时 18.2 使用stty实现超时 18.3 一般的超时功能 第19章 即时键盘响应 第20章 目录的复制 20.1 使用cp 20.2 使用tar 20.3 使用find 20.4 使用。rsync 第21章 X显示环境概述 21.1 display变量 21.2 使用ssh处理X流量 21.3 通过第三方系统的X应用 21.4 用户-Profile项 21.5 根-Profile项 21.6 弹出一个临时的根窗口 第22章 X导航窗口 22.1 导航窗口的作用 22.2 建立导航 22.3 浏览窗口 第23章 命令行电子邮件附件 23.1 uuencode 23.2 MIME编码 第24章 单行文本处理 24.1 显示特殊域 24.2 指定域分隔符 24.3 简单的模式匹配 24.4 几个值的匹配域 24.5 确定域的数目 24.6 确定最后一个域 24.7 确定倒数第二个域 24.8 给awk传送变量 24.9 在一定条件下使用给awk传送的变量 24.10 显示域的范围(主要方法) 24.11 显示域的范围(备选方法) 24.12 使用awk确定串的长度 24.13 使用expr确定串的长度 24.14 使用awk显示一个子串 24.15 使用expr显示一个子串 24.16 使用sed进行简单的查找替换 24.17 忽略文件中的空行和注释行 24.18 使用sed进行双查找替换 24.19 使用sed过滤行 24.20 使用egrep查找多个串 24.21 查找进程表的一个清理方法 24.22 使用awk进行列求和计算 24.23 使用awk产生随机数字 24.24 从shell中产生随机数字 24.25 使用sed显示基于字符的域 24.26 特殊字符转义 24.27 使用grep从一个模式匹配中返回末尾行 24.28 使用grep返回模式匹配之前的行 第25章 在适当的位置编辑文件 25.1 使用ed进行简单的查找替换 25.2 使用ed查找替换、分割 25.3 ed命令的例子 25.4 对一个文件中的特殊字符转义 第26章 平面文件中的变量赋值 第27章 读取管道输入 第28章 使用cat的自由格式输出 第29章 自动交互处理 第3部分 有用的脚本实例 第30章 使用procmail自动处理邮件 30.1.procmailrc文件 30.2 使用示例 30.3 代码 第31章 进程管理监视器 第32章 管理文件的计数 32.1 文件计数监视器 32.2 测试文件数目的计算方法 第33章 从inittab执行进程 第34章 自动RCS 第35章 带颜色的/proc报告 第36章 口令老化通知 36.1 脚本初始化 36.2 开始处理 36.3 确定口令年龄 第37章 伪shadow文件 第38章 搭建Linux金系统 第39章 系统快照 39.1 快照脚本 39.2 快照升级 39.3 创建最新快照 39.4 最后的想法 第40章 删除大文件和日志滚动 第41章 核心探测器 第42章 网络适配器故障转移 42.1 检查网络 42.2 转换接口 附录A 测试开关 附录B 特殊参数 附录C shell脚本编程的其他资源 C.1 手册 C.2 图书 C.2.1 脚本编程图书 C.2.2 补充图书 C.3 shell资源 C.4.网络资源
### 回答1: 可以使用sed命令来替换文件内容。sed命令可以在文件查找替换指定的文本。例如,要将文件中的所有"old_text"替换为"new_text",可以使用以下命令: ``` sed -i 's/old_text/new_text/g' file.txt ``` 其中,-i选项表示直接在文件中修改,而不是输出到终端。s表示替换操作,/old_text/new_text/是替换的模式,g表示全局替换,即替换所有匹配的文本。file.txt是要替换文件名。 需要注意的是,sed命令会直接修改文件内容,因此在使用前最好备份一下文件。 ### 回答2: Shell脚本是一种在Unix或类Unix操作系统中常用的脚本语言,用于编写脚本程序处理文件或执行任务。Shell脚本的一个常用功能是替换文件内容。 在Shell脚本中,可以使用sed命令来实现替换文件内容。sed是一种流编辑器,用于在输入流中进行文本替换等操作。sed支持正则表达式,因此可以用来匹配需要替换的文本。 使用sed命令替换文件内容通常需要指定替换的文本、文件名和替换的目标。例如,要将文件中的所有"a"替换为"b",可以使用以下命令: ```bash sed 's/a/b/g' filename ``` 在这个例子中,s代表替换操作,a是待替换的文本,b是目标替换文本,g表示全局替换。filename是要进行替换操作的文件名。 要在Shell脚本中使用sed命令替换文件内容,可以将上述命令嵌入到Shell脚本中,并通过变量或参数来指定需要替换的文本和文件名。例如,以下是一个简单的Shell脚本,用于将指定文件中的全部"a"替换为"b": ```bash #!/bin/bash # 替换文件内容脚本 # 用法:replace.sh old new file1 file2 ... old=$1 # 需要替换的文本 new=$2 # 目标替换文本 shift 2 # 将命令行参数向左移动2位,以便获取文件名列表 for file in "$@"; do sed -i "s/$old/$new/g" "$file" # 执行替换操作 done ``` 以上脚本接受三个参数,分别是待替换的文本、目标替换文本和需要替换内容文件名列表。脚本使用shift命令向左移动2位,以便获取文件名列表。 该脚本使用for循环遍历所有文件名,并在每个文件上执行sed命令进行替换操作。-i选项表示直接在原文件中修改内容,而不是输出到终端。最终,所有文件都将被替换为目标文本。 ### 回答3: Shell脚本是一种命令语言,可以简单快速的编写脚本来完成各种文件操作。在日常工作中,我们经常需要对某些文件内容进行批量的替换操作。 Shell脚本实现文件替换操作,主要涉及以下几个方面: 1.文件搜索:使用Shell脚本中的find命令,可以快速地搜索指定目录下的所有文件,特别是可以根据文件名、大小、权限等参数进行过滤,以定位到需要替换的目标文件。 2.文件读取:使用Shell脚本中的cat命令,可以读取指定文件内容,并存储到变量中以便处理。 3.字符串替换:使用Shell脚本中的sed命令,可以对存储在变量中的文件内容进行字符串替换。sed支持正则表达式,可以精确地匹配需要替换的字符串。 4.目标文件写入:使用Shell脚本中的echo命令,可以将替换后的文件内容写入目标文件中。 下面是一个具体的Shell脚本示例,用于将指定目录下的所有txt文件中的hello替换为world: ```bash #!/bin/bash # 搜索指定目录下的所有txt文件 find /path/to/directory -name "*.txt" | while read file do # 读取文件内容 content=`cat $file` # 替换字符串 newcontent=`echo $content | sed 's/hello/world/g'` # 将替换后的内容写入文件 echo "${newcontent}" > $file done ``` 在本例中,我们使用了find命令搜索到txt文件,使用while和read命令进行文件遍历,对每个文件使用cat命令读取文件内容,并使用sed命令进行字符串替换,最后将替换后的内容通过echo命令写入到文件中。 值得一提的是,这只是一个简单的Shell脚本示例,实际的文件替换操作可能会更加复杂,需要根据具体需求进行适当地改进。同时需要注意,文件替换是一项十分危险的操作,需要对替换结果进行仔细的检查和测试,以确保文件没有被损坏或者文件内容没有遗漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值