目录
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. 参考
- 【Shell】Sed 删除、替换、增加字符串
- Insert a Line With Spaces Using sed
版权归原作者 云满笔记 所有, 如有侵权,请联系我们删除。