1

005 Linux 命令三剑客之-sed

 2 years ago
source link: https://segmentfault.com/a/1190000041334906
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
  • grep:数据查找定位
  • awk:数据切片,数据格式化,功能最复杂
  • sed:数据修改

01 Linux 命令三剑客?

三剑客各有所长,和锅锅一一搞起就是了!

  • sed:擅长数据修改。
  • grep:擅长数据查找定位。
  • awk:擅长数据切片,数据格式化,功能最复杂。
    sed(全称:Stream Editor),擅长对文件做数据做修改的操作,非常高效。这里总结一些增删改的基础用法。

02 不用 vim 怎么在文件末尾添加内容呢?

  • 使用 vim 需要在文件内部编辑,有时只是想在文件底部添加一句话或一个参数,需要经历vim [文件] ->G (移动到底部)->o 下一行添加 ->编辑内容 ->保存退出。
  • 这个步骤真麻烦,sed 可以轻便的实现这些功能!
  • ps: 其实还有个echo命令也有这个功能,echo "文件内容" >> [文件名]。

03 增(追加),内置命令字符a

使用示例:

  • sed -i '$a 哈哈哈'  info.log #在文件末尾追加"哈哈哈"字符串。
  • sed -i '20a 啦啦啦' info.log  #在文件【info.log】第20行字符下一行,追加字符串“啦啦啦”。
  • sed -i '20i 啦啦啦' info.log  #在文件【info.log】第20行字符上一行,追加字符串“啦啦啦”。
  • sed -i 'a 嘎嘎'  info.log  #在文件【info.log】每行字符下一行追加字符串“嘎嘎”。
  • sed -i 'i 大大'  info.log  #在文件【info.log】每行字符上一行追加字符串“大大”。
  • sed -i '1i 第一行啦'  info.log  #在文件【info.log】开头插入字符串“第一行啦”。
  • sed -i '/book/a  HH'  info.log #匹配包含 book 的行,并在其后添加 book。

04 改(替换),内置命令字符s

使用示例:

  • sed -i 's/book/books/'  info.log  #把【info.log】文件里第一个"book" 替换为"books"。
  • sed -i 's/book/books/g' info.log #把【info.log】文件里所有的"book" 替换为"books"。

05 删,内置命令字符d

使用示例:

  • sed -i '2d' info.log #删除【info.log】文件的第二行。
  • sed -i '1,3d' info.log  #删除【info.log】文件的1到3行。
  • sed -i '/^啦啦啦/,/$HH/d'  info.log  #删除【info.log】中以 "啦啦啦" 开头一直到以"HH"结尾的行。
  • sed -i '/^$/d' info.log #删除所有的空白行

06 内置命令 s (替换作用)高级使用

(1)替换命令的格式

sed [选项] s/[pattern]/[replace]/[flags]

[选项]常用的几个参数:

  • -f #script-file 从文件中读取脚本指令,对编写自动脚本程序很实用。
  • -i #该选项将直接修改源文件,否则所有的操作对文件都不生效哦,当然线上使用的时候要谨慎!
  • -e #script 允许多个脚本指令被执行。

[pattern]
含义:待匹配的需要替换的内容。

[replace]
常见的特殊含义字符:

  • & # 用正则表达式匹配的内容进行替换。
  • \  # 转义(转义替换部分包含:&、\等)。

[flags]
常见的可选参数:

  • -n # 1-512之间的数字,表示对[pattern]中指定内容第n次出现进行替换。如一行中有3个H,而只想替换第二个H。
  • -g # 对[pattern]中指定的内容进行全局更改。没有g则只有第一次匹配被替换。

(2) 多个sed命令执行

多个sed命令依次执行,用分号分割或加选项 -e,
使用示例:

  • sed 's/yes/no/;s/static/dynamic/'  info.log  # 示例1,同时指定了2个sed命令。
  • sed -e 's/yes/no/' -e 's/static/dynamic/'  info.log  #示例2,同时指定了2个sed命令。

(3)实践 sed 搜寻替换

把 test.html 文件中的第二个 <body> 替换为 </body>

<html>
<body>Hello the World!<body>
</html>

分析实际就是把第二个 body 替换为 /body,命令如下。

sed -i 's/body/\/body/2'  test.html

(4)实践 sed,写一个脚本实现替换功能

把 test.html 文件中的第二个 <body> 替换为 </body>

<html>
<body>Hello the World!<body>
</html>

分析实际就是把第二个 body 替换为 /body,命令如下。
编写执行脚本的步骤如下:

touch sed.sh
sed.sh 中写入脚本内容:

#sed替换脚本
s/body/\/body/2

对sed.sh 脚本赋予可执行权限
chmod ug+x sed.sh

执行sed.sh 脚本,对文件进行处理
sed -i -f sed.sh  test.html

  • (1)内置命令字符,即上面单引号内的的 i(insert)、a(append)、s(search&replace)、d(delete),插入、追加、替换、删除,分别小结了其用法。 
  • (2)$代表文件末尾,^代表文件开头。
  • (3)sed 的 -i (注意这个是可选参数,和单引号内的 i 不是一个含义啦。)选项可以直接修改文件内容,这功能非常有帮助!如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!sed 命令却可以非常高效率的来干这个!
  • (4)此外还介绍了 sed 的内置命令 s 的高级用法,sed 最擅长的就是数据修改!锅锅就说到这里,下期见!

「不甩锅的码农」原创,转载请注明来源,未经授权禁止商业用途!同名 GZH 请关注!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK