shell三剑客: sed命令

sed(stream editor) 是一个Unix和Unix-like操作系统中的流编辑器,用于执行基本的文本转换。它可以对输入的文本数据进行过滤和变化,然后将结果输出到标准输出设备或文件,sed的强大之处在于它支持使用正则表达式来匹配和替换文本,这使得它成为文本处理中的一个非常灵活和强大的工具。

工作原理:
sed 读取输入的文本数据,默认情况下以行为单位进行处理。对于每一行,sed都会将其加载到内部的模式空间(pattern space),对其执行一系列的命令,然后输出修改后的内容到标准输出。如果没有指定输出到别处,sed的修改通常不会直接改变源文件。

基本语法:

sed [optoons] 'command' [input file]

数字和正则定址:
  • 数字可以用来指定要处理的特点行,例如sed -n ‘5p’ filename.txt 会打印第五行。
  • 正则表达式可以用来更精确地匹配文本,例如sed -n ‘/pattern/p’ filename.txt 会打印所欲包含 "pattern"的行。

基于子命令:

  • -p: 打印模式空间的内容。
  • -d:删除模式空间的内容,不输出到标准输出。
  • -s:替换文本,例如 sed ‘s/old/new/g’ filename.txt 会将所有的 “old” 替换为“new”
  • -a:在当前模式空间的内容后面追加文本。
  • -i:在当前模式的内容前面插入文本。
  • -c:替换当前模式空间的内容。

最常用子命令s的用法:

sed 's/old/new/g' filename.txt  #替换所有出现的old为new
sed 's/old/new/2' filename.txt  #替换每行中出现的old的第二个实例为new
sed 's/old/new/' filename.txt   #只替换第一个出现的old为new

sed的选项:

  • -i:直接修改文件(在某些系统上需要后缀)
  • -n:默认认为打印所有行,使用此选项将关闭这一行为,除非显示地使用p子命令
  • -e:允许执行多个脚本,例如sed -e ‘s/old/new/g’ -e ‘d’ filename.txt (使用-i使用要分开使用: -i -e)
  • -r 或 -E:使用扩展正则表达式。

示例:

  1. 打印文件的第一行:

     sed -n '1p' filename.txt
    
  2. 打印文件的最后一行:

     sed -n '$p' filename.txt
    
  3. 打印文件的第2到第5行:

     sed -n '2,5' filename.txt
    
  4. 删除文件的第一行:

     sed '1d' filename.txt > newfile.txt
    
  5. 删除文件的最后一行:

     sed -i '$d' filename.txt
    
  6. 替换文件中所有出现的“oldstring”为“newstring”:

     sed 's/oldstring/newstring/g' filename.txt
    
  7. 仅替换文件中第二行的所有“oldstring”为“newstring”:

     sed '2s/oldstring/newstring' filename.txt
    
  8. 替换以“text”开头的行中的“oldstring”为“newstring”:

     sed '/^test/s/oldstring/newstring/'  filename.txt
    
  9. 删除以“text”开头的行:

     sed '/^test/d'  filename.txt
    
  10. 删除以“text”结尾的行:

    sed '/text$d/' filename.txt
    
  11. 将文本“text-at-end” 添加到每行的末尾:

    sed 's/$/ test-at-end/' filename.txt
    
  12. 将文本“test-at-start”添加到每行的开头:

    sed 's/^/text-at-start' filename.txt
    
  13. 在第二行位置插入文本“text-to-insert”

    sed '2i text-to-insert' filename.txt
    
  14. 在匹配“pattern”的行后面追加文本“text-after”(后面即下一行):

    sed '/pattern/a text-after/'  filename.txt
    
  15. 在匹配“pattern”的行前插入文本“text-before(前面即上一行)”:

    sed '/pattern/i text-before' filename.txt
    
  16. 删除匹配“pattern”的行:

    sed '/pattern/d' filename.txt
    
  17. 复制匹配“pattern”的行到文件末尾:

    sed -n '/pattern/p' filename.txt >> filename.txt
    
  18. 打印行号:

    sed '=' filename.txt
    
  19. 打印行号和对应的行内容:

    sed -n '=;p' filename.txt
    
  20. 反转文件的行顺序:

    sed '1!G;h;$!d' filename.txt
    
  21. 删除文件中空行

    sed '/^$/d' filename.txt
    
  22. 删除文件中包含空白行的行:

    sed '/[[:space:]]*$/d' filename.txt
    
  23. 删除文件中的注释行(以#开头)

    sed '/^#/d' filename.txt
    
  24. 删除文件中的重复行:

    sed ':a;N;$!ba;s/\n//g' filename.txt | sed 's/^\(.*\)\(.*\)/\2 \1/' | sed 's/^\(.*\) \(.*\)$/\2 \1/' | sort | uniq
    
  25. 将文件中的每个单词转换为大写字母:

    sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' filename.txt
    
  26. 将文件中的每个单词转换为小写字母:

    sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' filename.txt
    
  27. 将文件中的数字递增1:

    sed 's/\([0-9]\+\)/ expr echo \1 + 1/e' filename.txt
    
  28. 将文件中的特定列替换为其他值:

    sed 's/^[^ ]*\([^ ]*\).*/\1/' filename.tx
    
  29. 使用自定义分隔符:

    sed 's|oldstring|newstring|g' filename.txt
    
  30. 使用多个sed表达式:

    sed -e 's/oldstring/newstring/g' -e '/pattern/d' filename.txt
    

参考: https://mp.weixin.qq.com/s/9CQH5Yu4DG3YZN8odufC7g

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值