shell 中的替换文本命令

本文详细介绍Vi编辑器中的替换命令用法,包括基本语法、全局替换、条件替换等高级技巧,并通过实例展示如何高效地批量修改文本。
使用方法: 进入文件后, 按ESC , 然后
冒号 [addr]s/源字符串/目的字符串/[option]
常用替换文本:
全局替换:
%s/源字符串/目的字符串/g

全局替换, 边替换边需要按y进行确认(按一次y就OK了, 不用enter)
%s/源字符串/目的字符串/c


详细如下:
语法为 :[addr]s/源字符串/目的字符串/[option]
全局替换命令为::%s/源字符串/目的字符串/g
[addr] 表示检索范围,省略时表示当前行。
如:“1,20” :表示从第1行到20行;
“%” :表示整个文件,同“1,$”;
“. ,$” :从当前行到文件尾;
s : 表示替换操作
[option] : 表示操作类型
如:g 表示全局替换; 
c 表示进行确认
p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
省略option时仅对每行第一个匹配串进行替换;
如果在源字符串和目的字符串中出现特殊字符,需要用”\”转义
下面是一些例子:
#将That or this 换成 This or that
:%s/\(That\) or \(this\)/\u\2 or \l\1/
—- 
#将句尾的child换成children
:%s/child\([ ,.;!:?]\)/children\1/g
—-
#将mgi/r/abox换成mgi/r/asquare
:g/mg\([ira]\)box/s//mg//my\1square/g    <=>  :g/mg[ira]box/s/box/square/g
—-
#将多个空格换成一个空格
:%s/  */ /g
—-
#使用空格替换句号或者冒号后面的一个或者多个空格
:%s/\([:.]\)  */\1 /g
—-
#删除所有空行
:g/^$/d
—-
#删除所有的空白行和空行
:g/^[  ][  ]*$/d
—-
#在每行的开始插入两个空白
:%s/^/>  /
—-
#在接下来的6行末尾加入.
:.,5/$/./
—-
#颠倒文件的行序
:g/.*/m0O  <=> :g/^/m0O
—-
#寻找不是数字的开始行,并将其移到文件尾部
:g!/^[0-9]/m$ <=> g/^[^0-9]/m$
—-
#将文件的第12到17行内容复制10词放到当前文件的尾部
:1,10g/^/12,17t$
~~~~重复次数的作用
—-
#将chapter开始行下面的第二行的内容写道begin文件中
:g/^chapter/.+2w>>begin
—-
:/^part2/,/^part3/g/^chapter/.+2w>>begin
—-
:/^part2/,/^part3/g/^chapter/.+2w>>begin|+t$

more details:
关于linux vi命令替换的使用说明 - 51CTO.COM
http://os.51cto.com/art/200907/140987.htm
Shell 中,替换文本字符串的命令有多种实现方式,常见的方法包括使用 `sed`、`awk`、`bash` 内建字符串操作等工具。以下是几种常见的命令及其用法: ### 使用 `sed` 命令进行替换 `sed` 是一种流编辑器,常用于文本替换操作。基本语法如下: ```bash sed 's/原字符串/新字符串/g' 文件名 ``` 例如,将文件 `file.txt` 中的所有 `old` 替换为 `new`: ```bash sed 's/old/new/g' file.txt ``` 如果需要直接修改文件内容,可以使用 `-i` 选项: ```bash sed -i 's/old/new/g' file.txt ``` ### 使用 `awk` 命令进行替换 `awk` 也可以用于文本替换。例如,替换文件 `awk.txt` 中的特定字符串 `dayhour_behavior_time.` 为 `new_string`: ```bash awk '{gsub(/dayhour_behavior_time./, "new_string")}1' awk.txt > temp.txt && mv temp.txt awk.txt ``` 该命令使用 `gsub` 函数进行全局替换,并将结果写入临时文件,然后覆盖原文件[^1]。 ### 使用 `bash` 内建字符串替换 在 `bash` 脚本中,可以使用 `${var//str1/str2}` 进行字符串替换。例如: ```bash var="AAAszip_BBB.zip" var2=${var//zip/ZIP} echo $var2 ``` 输出结果为 `AAAsZIP_BBB.ZIP`。这种替换方式适用于变量中的字符串替换,不需要调用外部命令[^2]。 ### 替换多个字符串 如果需要完成多组字符串替换,可以编写一个 `bash` 脚本来实现。例如,将多个特定字符串替换为新的字符串: ```bash #!/bin/bash input="小草 你听清楚了吗 我不会" output=${input//小草/真是让人印象深刻} output=${output//你听清楚了吗/我说明白了吗} output=${output//我不会/我可以学} echo "$output" ``` 该脚本通过多次使用 `${var//str1/str2}` 替换完成多组字符串的替换操作[^3]。 ### 替换指定位置的字符串 如果需要替换字符串的开头或结尾部分,可以使用 `${var#pattern}` 或 `${var%pattern}` 等操作符。例如: ```bash a="hello, world, 88" echo ${a#he} # 删除以 "he" 开头的部分,输出 "llo, world, 88" echo ${a##*,} # 删除从开头到最后一个 "," 的内容,输出 " 88" echo ${a%88} # 删除以 "88" 结尾的部分,输出 "hello, world, " ``` 这些操作符可以用于截取和替换字符串的不同部分[^4]。 ### 替换指定字符串的最后一次出现 如果需要替换某个字符串的最后一次出现,可以使用 `sed` 或 `awk`。例如,替换文件 `222.txt` 中的最后一个 `ccc` 为 `xyzxyz`: ```bash count=$(grep -o 'ccc' 222.txt | wc -l) awk '$0=="ccc"{a[$1]++;if(a[$1]==count){print "xyzxyz"}else{print}}$0!="ccc"{print}' 222.txt > tmp.txt && mv tmp.txt 222.txt ``` 该命令通过统计 `ccc` 出现的次数,然后在最后一次出现时进行替换[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不止鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值