linux shell 修改文本 sed
linux shell 修改文本
echo
[root@DSI tmp]# echo 'yhqt1 test1' > test1.txt [root@DSI tmp]# cat test1.txt yhqt1 test1 [root@DSI tmp]# echo 'yhqt2 test2' > test1.txt [root@DSI tmp]# cat test1.txt yhqt2 test2 [root@DSI tmp]# echo 'yhqt1 test1' >> test1.txt ##追加 [root@DSI tmp]# cat test1.txt yhqt2 test2 yhqt1 test1
##增加文本
[root@DSI tmp]# cat >> test1.txt << EOF export HISTTIMEFORMAT='%F %T ' EOF
sed
[root@DSI tmp]# sed -i '$a test3' test1.txt ##$最后一行,a是新增 [root@DSI tmp]# cat test1.txt yhqt2 test2 yhqt1 test1 test3 [root@DSI tmp]# sed '/yhqt1/a\test4' test1.txt ##在yhqt1 行后面增加一行test4 yhqt2 test2 yhqt1 test1 test4 test3 [root@DSI tmp]# sed '/yhqt1/a\test5\ntest6' test1.txt ##在yhqt1 行后面增加2行 yhqt2 test2 yhqt1 test1 test5 test6 test3 [root@DSI tmp]# sed '/yhqt1/i\test7' test1.txt ##在yhqt1行前面增加一行test7 yhqt2 test2 test7 yhqt1 test1 test3 [root@DSI tmp]# cat test1.txt yhqt2 test2 test7 yhqt1 test1 test5 test6 test4 test3 test7 [root@DSI tmp]# sed -i '/test7/a\1111' test1.txt ##存在多行test7的情况,每个匹配的地方都会新增一行1111数据 [root@DSI tmp]# cat test1.txt yhqt2 test2 test7 1111 yhqt1 test1 test5 test6 test4 test3 test7 1111 ##如果只向第二个test7后面增加一行,可以先获取第二个test7的行号,然后根据此行号在后面增加一行数据 ##获取行号 [root@DSI tmp]# cat -n test1.txt |grep test7 |awk ' {print $1}'|sed -n "2"p 9 [root@DSI tmp]# sed -n '/test7/=' test1.txt |sed -n "2"p 9 [root@DSI tmp]# sed -e '9a\2222' test1.txt yhqt2 test2 test7 1111 yhqt1 test1 test5 test6 test4 test3 test7 2222 1111 [root@DSI tmp]# sed 's/test5/& yhq1314/g' test1.txt ##在指定行test5后面增加数据yhq1314 yhqt2 test2 test7 1111 yhqt1 test1 test5 yhq1314 test6 test4 test3 test7 1111 [root@DSI tmp]# sed -i 's|test2|test222|' test1.txt ##对字符串进行替换test2替换为test222 [root@DSI tmp]# cat test1.txt yhqt2 test222 test7 1111 yhqt1 test1 test5 yhq1314 test6 test4 test3 test7 1111 [root@DSI tmp]# sed -i '$a yhq,abc1,3456' test1.txt [root@DSI tmp]# cat test1.txt yhqt2 test222 test7 1111 yhqt1 test1 test5 yhq1314 test6 test4 test3 test7 1111 yhq,abc1,3456 [root@DSI tmp]# sed -i 's|,|*|' test1.txt ##替换特殊字符 [root@DSI tmp]# cat test1.txt yhqt2 test222 test7 1111 yhqt1 test1 test5 yhq1314 test6 test4 test3 test7 1111 yhq*abc1,3456
sed是stream editor(流编辑器)的缩写,是文本处理中非常重要的工具,配合正则表达式进行使用功能更强大。
sed可以替换给定文本中的字符串,可以利用正则表达式进行匹配
$ sed 's/pattern/replace_string/' file
或者
$ cat file |sed 's/patter/replaces_string/' file
使用 -i选项,可以将替换结果应用于原文件,很多在进行替换之后,借助重定向来保存文件
$ sed 's/text/replace/' file > newfile
$ mv newfile file
其实就是一个命令
$ sed -i 's/text/replace/' file
如果需要替换每一行中满足条件的内容,加参数g
$ sed 's/pattern/replace_string/g' file
后缀/g意味着sed会替换每一处匹配,如果需要从N+1开始匹配,加参数N
[root@DSI tmp]# echo this thisthisthis | sed 's/this/THIS/2g' this THISTHISTHIS [root@DSI tmp]# echo this thisthisthis | sed 's/this/THIS/3g' this thisTHISTHIS [root@DSI tmp]# echo this thisthisthis | sed 's/this/THIS/4g' this thisthisTHIS
#当需要从第N出匹配开始替换时,可以使用/Ng
字符/在sed中作为定界符使用。可以像下面一样
sed 's:text:replace:g'
sed 's|text|replace|g'
当定界符出现在样式内部时,必须使用前缀\对它进行转义
sed 's|te\|xt|replace|g'
\|是一个出现在样式内部并经过转义的定界符
1 移除空白行
$ sed '/^$/d' file ##/pattern/d会移除匹配样式的行,在空白行中,行尾标记紧随着行首标记 [root@DSI tmp]# cat test1.txt yhqt2 test222 test7 1111 yhqt1 test1 test5 yhq1314 test6 test4 test3 test7 1111 yhq*abc1,3456 xxx [root@DSI tmp]# sed -i '/^$/d' test1.txt [root@DSI tmp]# cat test1.txt yhqt2 test222 test7 1111 yhqt1 test1 test5 yhq1314 test6 test4 test3 test7 1111 yhq*abc1,3456 xxx
2 已匹配字符串标记&
在sed中,用&标记匹配样式的字符串,就能够在替换字符串时使用已匹配的内容
[root@DSI tmp]# echo this is an example | sed 's/\w\+/[&]/g' [this] [is] [an] [example] ##正则表达式\w\+ 匹配每一个单词,然后用[&]替换它,&对应于之前所匹配到的单词
3 子串匹配标记\1
&代表匹配给定样式的字符串,但也可以匹配给定样式的其中一部分
[root@DSI tmp]# echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' this is 7 in a number ##这个命令将digit 7替换为7.样式中匹配到的子串是7,\(pattern\)用于匹配子串,模式被包括在使用斜线转义过的()中,对于匹配到的第一个子串, 其对应的标记是\1,匹配到的第二个子串是\2,往后依次类推 [root@DSI tmp]# echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' EIGHT seven ##([a-z])\+\)匹配第一个单词,\([A-Z]\+\)匹配第二个单词,\1,\2用来引用他们,这种引用称为向后引用,在替换部分,他们的次序被更改 为\2\1,因此结果就是逆序
4 组合多个表达式
sed 'expression' | sed 'expression'
等价于
$ sed 'expression; expression'
5 引用
sed表达式通常用单引号来引用。也可以使用双引号。双引号会通过对表达式求值来对其进行扩展
[root@DSI tmp]# text=hello [root@DSI tmp]# echo hello world | sed "s/$text/HELLO/" ##$text的求值结果是hello HELLO world
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构