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

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

2023年7月26日发(作者:)

shell脚本⽂件内容查找和替换学习实践不是系统的学习,只是学习⼀下常⽤的命令,理解可能有错误,如果有路过的⼤神能够补充和指正,万分感谢!1.根据⽂件名查找⽂件1.1利⽤find命令find [path] -type f -name '[filename]' ! -path "[excludepath]"在path⽬录及⼦⽬录中寻找名字为filename的⽂件,并打印。[path]为空的时候查找当前⽬录及当前⽬录⼦⽬录下所有名字为filename的⽂件,忽略excludepath⽬录及其⼦⽬录下的结果。例如://查找当前⽬录及⼦⽬录下的所有.sh⽂件并打印$ find . -name '*.sh'

//查找catkin_ws⽬录及⼦⽬录下所有名为‘’的⽂件并打印$ find ~/catkin_ws -name ''

查找catkin_ws⽬录及⼦⽬录下所有名为‘’的⽂件并打印1.2利⽤grep命令有空总结2.⽂件内容查找和替换2.1 ⽂件内容查找2.1.1利⽤sed命令sed -n '/[text]/p' [filename]在filename⽂件中查找text并将所在⾏打印出来。例如://在当前⽬录下⽂件中查找'ff'字符串并打印所在⾏$ sed -n '/ff/p' ./fasdffff12.1.2利⽤grep命令有空再总结grep [text] [filename]在filename中查找text并打印,例如//在⽂件中查找aaa并打印所在⾏grep aaa //在⽂件中查找aaa(忽略⼤⼩写)并打印所在⾏grep -i 5 Aaa //打印本⾏及以下5⾏grep -A 5 aaa //打印本⾏及以上5⾏grep -B 5 aaa //打印本⾏及上下5⾏grep -C 5 aaa 2.2 ⽂件内容替换sed -i 's/[old]/[new]/g' [filename]在filename⽂件中查找old字符串并将其替换为new字符串例如://将中的ff替换为gg$ sed -i 's/ff/gg/g' //在中查找ff,⽆结果$ sed -n '/ff/p' //在中查找gg,发现2.1中两⾏中的ff已经变成gg$ sed -n '/gg/p' fasdgggg13.在指定⽂件中查找内容和替换结合上⽂中提到的⽂件名查找和⽂件内容查找和替换,通过管道符|和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就好。举个栗⼦://在⽂件中的aaa111所在⾏的下⼀⾏插⼊bbb222和ccc333sed -i '/aaa111/abbb222nccc333' 4.2 将⽂件内容插⼊另⼀个⽂件的指定⾏后⾯这⾥多说两句,这个问题的实际应⽤场景就是同事⽤Solidworks导出的URDF模型需要仿真,我需要将⼀些模型插⼊他的urdf⾥,上⾯4.1的⽅法就很⿇烦了。sed -i '[⾏号]r 内容所在的⽂件' [要被插⼊内容的⽂件]例如://讲的内容插⼊在的第三⾏后⾯sed -i '3r ' 5.实现if判断执⾏5.1 if的语法//⼀般模式if [ condition ]; then //commandfi注意在[后⾯和]前⾯都必须要有空格,其他注意事项见上⾯的链接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 #判断上⼀条的返回值是否为0if [ $? -eq 0 ]; then echo "aaa111 found"fi最后完成任务的成品脚本为#!/bin/sh#设定变量var=elevator11var='elevator11'#进⼊⽬录cd ~/catkin_ws/src/$var#在.launch⽂件中查找'/robots'并替换为'/urdf/'find . -name '*.launch' | xargs sed -i 's/robots/urdf/g'#在⽂件中查找'me2email'并替换为'me@email'find . -name '' | xargs sed -i 's/me2email/me@email/g'#在.launch⽂件中查找'elevator11/'替换为'/home/xcy/'find . -name '*.launch' | xargs sed -i 's/$(find "$var")//g'#在中查找字符串'world'grep world urdf/$#如果不存在,则插⼊⽂件中的内容if [ $? -ne 0 ]; thensed -i '2r /home/xcy/' urdf/$

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690362214a337943.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信