Linux-sed快速学

本文内容参照书籍总结

通用文本数据data.txt

Java
Python
Go
C

1.命令格式

sed options script file  

2.替换命令[script]

[/match_word/][num]s/old_word/new_word/flags

2.1 命令说明:

  • num[可选]: 一个数字或区间, 如数字2, 或者区间2, 5, 正无穷为:$
  • old_word: 需要替换的内容
  • new_word: 替换后的内容
  • flags: 替换标记, 默认数字:1

    • 数字,表明新文本将替换第几处模式匹配的地方;
    • g,表明新文本将会替换所有匹配的文本;
    • p,表明原先行的内容要打印出来;可以结合-n参数, 避免打印原内容
    • w file,将替换的结果写到文件中。

2.2 命令组合

  • -e '[num]{s/old_word/new_word/flags;s/old_word2/new_word2/flags2}'

3.删除命令

[num]d 或 /match_word/d
  • 示例:

    1. /o/d
    2. 2, 3d

    输出: Java换行C

    3.1二文本模式区间删除

  • '/match_word/, /match_word2/d': 如果match_word2未匹配, 则会将match_word匹配之后的所有数据都清除

    4.插入命令

[num]i\insert_word 或 [num]a\append_word
  • 示例:

    1. echo "Jim" | sed 'i\Hello'
    2. echo "Hello" | sed 'a\Jim'

    输出: Hello换行Jim, num可以在多行文本中选择某一行进行插入, 如3iinsert_word, 在第三行前进行插入insert_word

    5.修改命令

[num]c\change_word 或 /match_word/c\change_word
  • 示例:

    1. sed '2c\C++' data.txt
    2. sed '/Python/c\C++'

    输出: Java换行C++换行Go换行C

    6.转换命令

[num]y/old_chars/new_chars/
  • 示例:

    sed 'y/ao/LA/' data.txt

    输出: JLvL换行PythAn换行GA换行C, 这里a对应L, o对应A, old_chars与new_chars字符个数必须相同, 否则会出错

    sed '3y/ao/LA/' data.txt

    输出: Java换行Python换行GA换行C, 可选项num, 指定行或行区间

7.回顾打印

[num][/match_word/]p 或 [/match_word/]=
  • 实例:

    sed '/o/p' data.txt

    输出: Java换行Python换行Python换行Go换行Go换行C, p命令会打印原数据, 这里我们使用-n选项, 输出就可以为匹配到的数据:PythonnGo

    sed '/o/=' data.txt

    输出: Java换行2换行Python换行3换行Go换行C, 这里可以打印匹配到的行号, 使用-n, 可以忽略输出原数据

8.写入文本

[num][/match_word/]w filename
  • 示例:

    sed -n '1,3w data1.txt' data.txt

    结果: 查看data1.txt会发现, 顺利将data.txt的1到3行Java换行Python换行Go写入到data1.txt中了

重点详解

match_word

POSIX基础正则表达式(basic regular expression,BRE)引擎
支持的模式
  • ^:行首匹配

    • 示例:

      sed -n '/^J/p' data.txt

      输出: Java, 若匹配语句改为:/^a/, 则不会有输出

  • $:行末匹配

    • 示例:

      sed -n '/a$/p' data.txt

      输出: Java, 若匹配语句改为:/^Wa$/, 则不会有输出, 因为表示行文本必须为Wa

  • []: 字符组匹配, [^]排除字符, [0-9]或者[a-bc-z]区间

    • 示例:

      sed -n '[a-h]o' data.txt

      输出: Python换行Go

  • *: 0或多个字符

    • 示例:

      echo 'Jiiiiiiiiiiiim' | sed -n '/i*m$/p'

      输出: Jiiiiiiiiiiiim, 这里无论i有多少个都可以匹配到

  • 特殊字符组:

    [[:alpha:]] 匹配任意字母字符,不管是大写还是小写
    [[:alnum:]] 匹配任意字母数字字符0~9、A~Z或a~z
    [[:blank:]] 匹配空格或制表符
    [[:digit:]] 匹配0~9之间的数字
    [[:lower:]] 匹配小写字母字符a~z
    [[:print:]] 匹配任意可打印字符
    [[:punct:]] 匹配标点符号
    [[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR
    [[:upper:]] 匹配任意大写字母字符A~Z

你可能感兴趣的:(sed,linux)