前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux 文本三剑客 - sed

Linux 文本三剑客 - sed

作者头像
Mervyn
发布2021-11-04 14:37:45
8840
发布2021-11-04 14:37:45
举报
文章被收录于专栏:开发技术那些事

Linux 文本三剑客 - sed

sedstream editor 的缩写,它一种流编辑器,它一次处理一行内容 。

基本用法如下:

代码语言:javascript
复制
# sed --help
sed [OPTION]... {script-only-if-no-other-script} [input-file]...

# sed [参数] '范围 操作'  文件

例:

代码语言:javascript
复制
sed -n '1,4 p' demo.txt  # 打印demo.txt文件1~4行的内容

常用选项参数

  • -n 使用安静(silent)模式。加上-n参数后,则只有经过 sed 特殊处理的那一行(或者command)才会被列出来。
  • -i 直接编辑原文件
  • -i.bak 直接编辑原文件,同时会生成一个.bak的备份文件。推荐使用这种方式。防止误操作
  • -f -f filename 可以执行filename内的 sed 命令
  • -e 多点编辑

范围选择

sed 可以很灵活的查找对应范围的内容,常见的范围选择如下:

  • 2 选择第二行
  • $ 选择最后一行
  • 2,5 选择 2~5行
  • 1~2 奇数行
  • 2~2 偶数行
  • 1,$ 第一行到文件最后一行

另外 sed 还支持正则匹配。比如:

  • /name/ 出现name 字符的行
  • /name/,+3 出现 name 字符的行内容以后边的3行
  • /^xxx/ 选择已 xxx 开头的行
  • /xxx/,/yyy/ 出现 xxx 的行以及出现 yyy 行之间的数据
  • 常见正则匹配表达式如下:
    • ^ 匹配行开始。如:/^sed/ 以sed开头的行
    • 匹配行结束。如:/sed/ 以sed结尾的行
    • . 单个字符
    • * 0个或者多个匹配
    • + 1个或者多个匹配
    • ? 0个或者1个匹配
    • x\{m,n\} 重复连续字符x,m-n次数
    • `x{m} # 重复字符x,m次,如:/0{5}/匹配包含5个0(连续的)的行。

常见操作

  • p 打印匹配到的内容
  • d 将匹配到的内容进行删除。如果需要对原文件进行编辑, 需要结合 -i-i.bak 参数
  • w 匹配到的内容写入到其他文件。 例: sed -n '/xxx/ w output.txt' demo.txt # 将demo.txt 文件中包含 xxx 的行内容写入 output.txt

常用技巧

显示第一行的内容

代码语言:javascript
复制
sed -n '1'p filename

显示第三行到最后一行的内容

代码语言:javascript
复制
sed -n '3,$'p filename

显示匹配 name 关键的行

代码语言:javascript
复制
sed -n '/name/'p

打印出现 <command> 的行以及出现 </command> 行之间的数据

代码语言:javascript
复制
sed -n '/<command>/,/<\/command>/ p'  demo.txt

打印长度不小于5个字符的行

代码语言:javascript
复制
 sed -n  '/^.\{5\}/ p' demo.txt

删除所有的空行

代码语言:javascript
复制
sed -e '/^$/ d' demo.txt

删除行首的空格

代码语言:javascript
复制
sed -e 's/^[ \t]*//g' demo.txt

删除行尾的空格

代码语言:javascript
复制
sed -e 's/[ \t]*$//g' demo.txt

给文件的每一行使用双引号包围起来

代码语言:javascript
复制
sed  -e 's/.*/"&"/g' demo.txt

将文件的内容多行换成单行,同时每一行过滤掉收尾的空格并且使用双引号包围起来

例如:

abc 123

转成如下格式:

"abc","123"

代码语言:javascript
复制
sed -e 's/[ \t]*$//g' -e  's/^[ \t]*//g' -e '/^$/ d' -e 's/.*/"&"/g' demo.txt |tr "\n" "," |sed -e 's/,$//g'

# 这里还有一个相对简单的命令也可以起到相同的目的,不过行内字符串中间有空格或者换行符时得到的结果可能会不同
echo '"'`awk '{print $1}' demo.txt |xargs |sed 's/ /","/g'`'"'
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开发技术那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Linux 文本三剑客 - sed
    • 常用选项参数
      • 范围选择
        • 常见操作
          • 常用技巧
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档