linux sed和awk学习

sed

参考链接:
https://cloud.tencent.com/developer/article/1160822
https://www.runoob.com/linux/linux-comm-sed.html

简介

sed 是流式编辑器,可以一行一行地处理文件,不需要一次性将整个文件加载到内存。因此可以高效地处理大文件,不会受文件大小的限制。

语法:

sed [-hnV][-e<script>][-f<script文件>][文本文件]
  • -e后面跟具体的脚本,默认是有e的,所以可以不写
  • -f后面跟脚本文件
  • -h为帮助信息
  • -n为仅显示脚本处理后的结果
  • -V显示版本信息

sed脚本的动作包括:

  • a :插入, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行),这和vim中的a和i类似。
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
  • p :打印,将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
    p配合-n的说明:
sed -n '3p' line.txt # 打印第三行
sed '3p' line.txt # 打印所有行,第三行打印两次。  

替换

替换s的脚本的形式:

"[address1[,address2]]s/pattern/replacement/[flags]"
address 就是来指定行范围,pattern为正则表达式,flags 替换时的功能选项。

正则表达式参考:正则表达式

address 就是来指定行范围:

sed -n '3p' line.txt # 打印第三行
sed '3p' line.txt # 打印所有行,第三行打印两次。  
sed -n '$p' line.txt # 打印最后一行
sed -n '6,$p' line.txt # 打印从第六行到最后一行
sed -n '3,+2p' line.txt  # 打印第三行及下面2行,即打印第三、四、五行
sed -n '1~2 p' line.txt  # 从第1行开始,每个两行打印一次,即打印奇数行
sed -n '/2/p' line.txt  # /2/为正则表达式,即打印包含字符2的行
sed -n '/2/,3p' line.txt  # 打印包含字符2的行,以及此行到第三行内的所有行。如果含字符2的行的行号小于等于三,那么只输出含字符2的行。
sed -n '/2/,+3p' line.txt # 打印包含字符2的行,以及此行下的额外三行。
sed -n '/2/,/5/p' line.txt # 打印包含字符2的行,包含字符5的行,以及这两行之间的所有行。
sed -n '/Line/!p'  # 打印不包含“line”的行

flag:

  • g 表示改行出现的所有匹配内容都进行替换。如果不指定 flag 将默认只对改行匹配到的第一个做更改。
  • n,表示只更改该行匹配到的第n个
  • p 只输出匹配到的行,再行寻址里面已经用过
  • w 存储改变的行到文件,比如sed -n 's/i/I/w junk.txt' books.txt
  • i 匹配时忽略大小写

其他脚本动作

插入 i或a:

[address1[,address2]]i text
[address1[,address2]]a text

实例:

sed '/fish/,+3i ------------!' sed.txt # 匹配到 fish 字符的行以及此行的后面三行,这些行的前面都增加一行"------------!"

删除 d:删除指定行

[address1[,address2]]d

行替换 c:将指定的一行或多行替换成对应字串

[address1[,address2]]c Replace text

文件写入命令 w:将指定行输出到文件中,文件不存在的时候它会自动创建,如果已经存在的话则会覆盖原文件的内容。

[address1[,address2]]w file

q的作用:处理完第一次匹配的就推出

nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'  #

sed的多行处理功能

加载下一行处理 N:每次加载两行,将两行当成一行处理。
实例:

sed 'N; s/i/I/1' sed.txt # 两行合成一行进行处理,所以只会替换两行中第一个出现i的字符。1 表示只替换第一个匹配到的小写 i, 而不是替换所有的小写 i 。
sed 'N; s/\n/,/g' sed.txt # 将两行中间的回车替换成`,`,从而实现合并两行的目的。  

P命令用于输出N命令创建的多行文本的模式空间中的第一行,也就是说读进来两行,仅输出第一行。

sed -n 'N; P' sed.txt

常用实例

# c++删除注释
sed 's|//.*||g' hello.cpp # 将// 后面的所有字符替换为空格
# | 被用作分隔符,替代了常见的 / 分隔符。这在你的正则表达式中包含 / 字符时很有用,因为它可以避免歧义。

# 移除空行
sed '/^$/d'  

# 过滤所有的html标签,并移除空行
sed 's/<[^>]*>//g ; /^$/d' html.txt

其他

增加空行

sed -e '4 a \n' testfile # 是添加了一个字母n
sed -e '4 a \newline\nnewline2\n' testfile # 4 行之后追加 3 行(2 行文字(newline和newline2)和 1 行空行)

sed '4 a \\' testfile  添加一个空行,第一个\代表sed中的分隔符,代表下面的内容为添加的字符串;第二\代表转义符,但是后面没有跟任何内容。
sed '4 a \\n' testfile 
posted @ 2024-06-23 11:57  好人~  阅读(6)  评论(0编辑  收藏  举报