[关闭]
@adonia 2016-11-02T03:20:20.000000Z 字数 5342 阅读 173

Sed命令

操作系统


文件末尾追加文本

场景描述:

需要向配置文件的末尾追加文本信息。例如:现有mysql的配置信息(/etc/mysql/my.cnf),内容如下:

  1. [client]
  2. port = 3306
  3. socket = /var/run/mysqld/mysqld.sock
  4. [mysqld_safe]
  5. pid-file = /var/run/mysqld/mysqld.pid
  6. socket = /var/run/mysqld/mysqld.sock
  7. nice = 0
  8. [mysqld]
  9. skip-host-cache
  10. skip-name-resolve
  11. user = mysql
  12. pid-file = /var/run/mysqld/mysqld.pid
  13. socket = /var/run/mysqld/mysqld.sock
  14. port = 3306
  15. basedir = /usr
  16. datadir = /var/lib/mysql
  17. tmpdir = /tmp
  18. lc-messages-dir = /usr/share/mysql
  19. explicit_defaults_for_timestamp
  20. symbolic-links=0
  21. !includedir /etc/mysql/conf.d/

需要在文件末尾添加如下信息:

  1. sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

命令介绍:

追加文本的命令语法为:

  1. sed -i '$a\append_word' file_name

Notes:

  • append_word为待插入的文本字段

  • file_name为待修改的文件路径

针对上述示例,对应的执行语句为:

  1. sed -i '$a\sql_mode = \"STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"' /etc/mysql/my.cnf

Tips:

  • 注意转义字符

  • 文本追加,也可以使用形如echo "append_word" >> file_name的方式

文本每行下增加新行

如果需要向配置文件中的每一行的下一行都增加指定的文本字段,可使用如下命令:

  1. sed -i '/$/a append_word' file_name

Notes:

  • append_word为待插入的文本字段

  • file_name为待修改的文件路径

例如,源文件内容为:

  1. [client]
  2. port = 3306
  3. socket = /var/run/mysqld/mysqld.sock
  4. [mysqld_safe]
  5. pid-file = /var/run/mysqld/mysqld.pid
  6. socket = /var/run/mysqld/mysqld.sock
  7. nice = 0
  8. [mysqld]
  9. skip-host-cache
  10. skip-name-resolve
  11. user = mysql
  12. pid-file = /var/run/mysqld/mysqld.pid
  13. socket = /var/run/mysqld/mysqld.sock
  14. port = 3306
  15. basedir = /usr
  16. datadir = /var/lib/mysql
  17. tmpdir = /tmp
  18. lc-messages-dir = /usr/share/mysql
  19. explicit_defaults_for_timestamp
  20. symbolic-links=0
  21. !includedir /etc/mysql/conf.d/

执行命令sed -i '/$/ac' /etc/sql/my.cnf后,文件内容如下:

  1. [client]
  2. c
  3. port = 3306
  4. c
  5. socket = /var/run/mysqld/mysqld.sock
  6. c
  7. c
  8. [mysqld_safe]
  9. c
  10. pid-file = /var/run/mysqld/mysqld.pid
  11. c
  12. socket = /var/run/mysqld/mysqld.sock
  13. c
  14. nice = 0
  15. c
  16. c
  17. [mysqld]
  18. c
  19. skip-host-cache
  20. c
  21. skip-name-resolve
  22. c
  23. user = mysql
  24. c
  25. pid-file = /var/run/mysqld/mysqld.pid
  26. c
  27. socket = /var/run/mysqld/mysqld.sock
  28. c
  29. port = 3306
  30. c
  31. basedir = /usr
  32. c
  33. datadir = /var/lib/mysql
  34. c
  35. tmpdir = /tmp
  36. c
  37. lc-messages-dir = /usr/share/mysql
  38. c
  39. explicit_defaults_for_timestamp
  40. c
  41. c
  42. symbolic-links=0
  43. c
  44. c
  45. !includedir /etc/mysql/conf.d/
  46. c
  47. sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  48. c

替换每行中的关键字

语法格式为: sed -i 's/pattern/replace/g' file_name

Notes:

  • pattern是指待匹配的字符字段

  • replace是指需要替换成的字符字段

  • file_name是指需要处理的文件路径

例如,对于如下文本内容:

  1. This is my cat
  2. my cat's name is betty
  3. This is my dog
  4. my dog's name is frank
  5. This is my fish
  6. my fish's name is george
  7. This is my goat
  8. my goat's name is adam

现要将文本中每行的my替换为his,命令如下:

  1. sed -i 's/my/his/g' pet.txt

结果如下:

  1. This is his cat
  2. his cat's name is betty
  3. This is his dog
  4. his dog's name is frank
  5. This is his fish
  6. his fish's name is george
  7. This is his goat
  8. his goat's name is adam

Tips: 如果替换的字段包含了原字段,也就是在原字段的基础上左右加些字符,可以用&作为被匹配的变量。如将上述的his替换成[his],对应的命令为: sed -i 's/his/[&]/g' pet.txt

文本每行开头插入字段

语法格式为: sed -i 's/^/insert_word/g' file_name

Notes:

  • ^表示每行开头

  • insert_word表示需要插入的字段

  • file_name表示需要处理的文件路径

例如,需要在上述文本的每行开头增加line no:,命令如下:

  1. sed -i 's/^/line no: /g' pet.txt

结果如下:

  1. line no: This is his cat
  2. line no: his cat's name is betty
  3. line no: This is his dog
  4. line no: his dog's name is frank
  5. line no: This is his fish
  6. line no: his fish's name is george
  7. line no: This is his goat
  8. line no: his goat's name is adam

文本每行结尾追加字段

语法格式为: sed -i 's/$/append_word/g' file_name

Notes:

  • $表示文本结尾

  • append_word表示每行需要追加的字符字段

  • file_name表示待处理的文件路径

例如,需要在上述文本的每行结尾追加...,命令如下:

  1. sed -i 's/$/.../g' pet.txt

结果如下:

  1. This is his cat ...
  2. his cat's name is betty ...
  3. This is his dog ...
  4. his dog's name is frank ...
  5. This is his fish ...
  6. his fish's name is george ...
  7. This is his goat ...
  8. his goat's name is adam ...

指定行操作

对原有的文本文件稍作修改,如下:

  1. This is his cat, his cat's name is betty
  2. This is his dog, his dog's name is frank
  3. This is his fish, his fish's name is george
  4. This is his goat, his goat's name is adam

指定替换某一行的字段

语法格式为: sed -i 'ns/pattern/replace/g' file_name

Notes:

  • n表示行号

  • pattern表示待匹配的字段

  • replace表示替换成的字段

  • file_name表示待处理的文件路径

例如,将上述文本中的第三行的his替换成my,命令为: sed -i '3s/his/my/g' pet.txt

结果如下:

  1. This is his cat, his cat's name is betty
  2. This is his dog, his dog's name is frank
  3. Tmy is my fish, my fish's name is george
  4. This is his goat, his goat's name is adam

指定替换某一区间行数的字段

语法格式为: sed -i 'm,ns/pattern/place/g' file_name

Notes:

  • m,n分别表示起始行和结束行

  • pattern表示待匹配的字符字段

  • replace表示替换成的字段

  • file_name表示待处理的文件路径

例如,将上述文本中的2~4行中的his替换成my,命令为: sed -i '2,4s/his/my/g' pet.txt

结果如下:

  1. This is his cat, his cat's name is betty
  2. Tmy is my dog, my dog's name is frank
  3. Tmy is my fish, my fish's name is george
  4. Tmy is my goat, my goat's name is adam

指定替换每行固定列数的字段

语法格式为: sed -i 's/pattern/replace/n' file_name

Notes:

  • pattern表示待匹配的字符字段

  • replace表示替换成的字符字段

  • n表示匹配的列数,即每行的第几个匹配字段将要被替换

  • file_name表示待处理的文本路径

例如,将上述文本中的每行的第2个his替换成my,命令如下: sed -i 's/his/my/2' pet.txt

结果如下:

  1. This is my cat, his cat's name is betty
  2. This is my dog, his dog's name is frank
  3. This is my fish, his fish's name is george
  4. This is my goat, his goat's name is adam

注意: 上述文本中This也是his的匹配规则中的。

替换每行指定列之后所有匹配的字段

语法格式为: sed -i 's/pattern/replace/ng' file_name

Notes:

  • pattern表示待匹配的字符字段

  • replace表示要替换成的字符字段

  • n表示从第几列开始,替换匹配的字段

  • file_name表示待处理的文本路径

例如,将上述文本中的每行的his,从第2个开始,全部替换成my,命令如下: sed -i 's/his/my/2g' pet.txt

结果如下:

  1. This is my cat, my cat's name is betty
  2. This is my dog, my dog's name is frank
  3. This is my fish, my fish's name is george
  4. This is my goat, my goat's name is adam

多项匹配

语法格式为: sed -i '[m,n]s/pattern1/replace1/[n]g; [m,n]s/pattern2/replace2/[n]g' file_name

Tips: 多个匹配规则之间用分号(;)隔开即可

例如,原文本内容如下:

  1. This is his cat, his cat's name is betty
  2. This is his dog, his dog's name is frank
  3. This is his fish, his fish's name is george
  4. This is his goat, his goat's name is adam

现将前两行中的his,从第2个开始,全部替换成my
从第3行开始,将所有的This全部替换成That。命令如下:

  1. sed -i '1,2s/his/my/2g; 3,$s/This/That/g' pet.txt

结果为:

  1. This is my cat, my cat's name is betty
  2. This is my dog, my dog's name is frank
  3. That is his fish, his fish's name is george
  4. That is his goat, his goat's name is adam

说明:上述的命令等价于: sed -i -e '1,2s/his/my/2g' -e '3,$s/This/That/g' pet.txt

圆括号匹配

语法格式为: sed 's/context\(pattern\)/\1/g' file_name

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注