sed 命令使用

1. sed 命令使用

sed 命令常用到的两个选项:

  • -i : 直接在文件上编辑 (edit files in place)
  • -e[默认选项]: 只在命令行输出, 而文件不改变 (add the script to the commands to be executed)
    注: 使用 sed 命令可以使用 -i 或者 -e 选项(以下例子仅以-i 举例)
$ sed [选项] ‘[动作]’ 文件名

sed 的常用选项:

  • -r: 使用扩展正则表达式
  • -e: 它告诉 sed 将下一个参数解释为一个 sed 指令, 只有当命令行上给出多个 sed 指令时才需要使用-e 选项
  • -f: 后跟保存了 sed 指令的文件
  • -i: 直接对内容进行修改, 不加-i 时默认只是预览, 不会对文件做实际修改
  • -n: 取消默认输出, sed 默认会输出所有文本内容, 使用-n 参数后只显示处理过的行

sed 中的编辑命令:

  • a: 追加 向匹配行后面插入内容
  • c: 更改 更改匹配行的内容
  • i: 插入 向匹配行前插入内容
  • d: 删除 删除匹配的内容
  • s: 替换 替换掉匹配的内容
  • p: 打印 打印出匹配的内容, 通常与-n 选项和用
  • =: 用来打印被匹配的行的行号
  • n: 读取下一行, 遇到 n 时会自动跳入下一行
  • r,w: 读和写编辑命令, r 用于将内容读入文件, w 用于将匹配内容写入到文件

1.1. 替换

sed 替换的基本语法为:

sed 's/原字符串/替换字符串/'

单引号里面, s 表示替换, 三根斜线中间是替换的样式, 特殊字符需要使用反斜线 “” 进行转义。

单引号" ‘ ’“是没有办法用反斜线”"转义的, 这时候只要把命令中的单引号改为双引号就行了, 格式如下:

# 要处理的字符包含单引号
sed "s/原字符串包含'/替换字符串包含'/" 

命令中的三根斜线分隔符可以换成别的符号, 有时候替换目录字符串的时候有较多斜线, 这个时候换成其它的分割符是较为方便, 只需要紧跟 s 定义即可。

# 将分隔符换成问号"?":
sed 's? 原字符串? 替换字符串? '

可以在末尾加 g 替换每一个匹配的关键字, 否则只替换每行的第一个, 例如:

# 替换所有匹配关键字
sed 's/原字符串/替换字符串/g'

sed 处理过的输出是直接输出到屏幕上的, 使用参数"i"直接在文件中替换。

# 替换文件中的所有匹配项
sed -i 's/原字符串/替换字符串/g' filename

多个替换可以在同一条命令中执行, 用分号";"分隔, 其格式为:

# 同时执行两个替换规则
sed 's/^/添加的头部&/g; s/$/&添加的尾部/g'
  • 替换环境变量: sed -i 's/\${DATAKIT_HOST}/'"${DATAKIT_HOST}"'/g' /usr/share/filebeat/filebeat.yml

1.1.1. 批量替换字符串

sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir

1.2. 插入

  • 在第 N 行插入: sed -i 'Nd' FILE

1.2.1. 添加空格

在行首添加: To solve the problem, we need to add a backslash “” after the “a” or “i” command

sed -i "/location \/ {/i\    location = /server_status {" /etc/nginx/conf.d/default.conf

1.2.2. 添加文本到文件的第一行和最后一行

sed -i '1i 添加的内容' filename # 在第一行前添加字符串 
sed -i '$i 添加的内容' filename # 在最后一行行前添加字符串 
sed -i '$a 添加的内容' filename # 在最后一行行后添加字符串

1.3. 特殊字符

1.3.1. 特殊字符的使用

  • "^"表示行首
  • "$"符号如果在引号中表示行尾, 但是在引号外却表示末行(最后一行)
# 注意这里的 " & " 符号, 如果没有 "&", 就会直接将匹配到的字符串替换掉
sed 's/^/添加的头部&/g'      #在所有行首添加
sed 's/$/&添加的尾部/g'      #在所有行末添加
sed '2s/原字符串/替换字符串/g'  #替换第 2 行
sed '$s/原字符串/替换字符串/g'   #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换 2 到 5 行
sed '2,$s/原字符串/替换字符串/g' #替换 2 到最后一行

1.3.2. 特殊字符

遇到特殊字符, 如左斜线"/" 这个时候, 需要用双引号作为 sed 的操作指令, 并用右斜线"" 转义:

如删除 file 文件中, 含有 “a/b/Makefile:106:” 字符串的行

sed -i  "/a\/b\/Makefile:106: warning:/d"  file

1.3.3. linux shell sed 替换的字符串 包含 单引号如何处理

问题描述: linux 中 sed 命令替换包含引号、斜杠等特殊字符的的使用

解决方案: 在字符替换中, 可能会遇见引号, "/"等的替换, 这时应该注意, sed 的命令原型是:

sed -i "s/oldstring/goalstring/g" file

如果一个路径是 data/path/abc, 现在要将此路径换成一个字符串 cde

但是这时跟在 s 后边的其实是分隔符, 用以将 oldstring 替换成 cde; 他可以使用任意字符, 这时如果字符串中有"/", 就会发生混乱, 在这个时候可以用#当做分隔符, 就变成

sed -i "s#abc#cde#g" file

这时如果 abc 中包含"/"就可以随便替换了;

引号的替换: 需要将引号转义, 使用反斜杠"“, 比如替换” ’ ‘div’ ’ “, 如果需要将它替换成‘div’ ; 可以使用 sed -i s#”‘’#'#g 就能替换了。

引号替换 demo:
如下 demo, 我们把 #listen_addresses = 开头的行, 替换为 listen_addresses = ‘*’

sed -i 's/#listen_addresses =.*/listen_addresses = \'*\''/ $pg_conf

1.4. 换行、回车

The sed on BSD does not support the \n representation of a new line (turning it into a literal n):

$ echo "123." | sed -E 's/([[:digit:]]*)\./\1\n next line/'
123n next line

GNU sed does support the \n representation:

$ echo "123." | gsed -E 's/([[:digit:]]*)\./\1\nnext line/'
123
next line

解决方法:

  • 首先试 \n
  • 如果不行, 再使用直接回车换行, 会跟着换行的

1.5. 获取

1.5.1. 获取文件中 ${xxx} 中的变量字符 xxx

# sed -n 's/^[^#].*${\(.*\)}.*/\1/p' xxx.sh
REDIS_HOST
REDIS_PORT
REDIS_PASSWORD

1.6. 删除

  • 删除第 N 行: sed -i 'Nd' filename
  • 删除第 N~M 行: sed -i 'N,Md' filename #file 的 [N,M] 行都被删除
  • 删除 shell 变量表示的行号(配合 for 等语句使用): sed -i "\${var1},${var2}d" filename # 这里引号必须为双引号
  • 删除最后一行: sed -i '$d' filename
  • sed 命令删除包含特定字符行: 删除包含"xxx"的行: sed -i '/xxx/d' filename

1.7. 参考

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云满笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值