在日常运维工作中 用 sed 命令 来修改文本特别方便,下面将用一个工作中的案例 来演示一下 sed 命令配合正则表达式的应用。
我有一个文本 history.txt ,这个文本是另一台机器上的命令记录,我想将其中一些命令提取出来,放到脚本里面,供以后重复使用。
先来看看 history.txt 文本的内容:
cat history.txt
第一个需求,我想把 history.txt 文本里面的 第 7行到 41行 删除,这些命令是我不需要的 :
### 使用 sed 命令 的 'd' 指令 删除
sed '7,41d' history.txt
注意看截图上的文本输出,第7行到41行不见了,也就是被删除了。目前真正的 history 文档还没有修改,如果要修改生效,请加上 -i 参数:
sed -i '7,41d' history
第二个需求,我想把 history.txt 文档里面 每行命令之前的 数字跟空格去掉,最终效果如下:
具体实现:
先看看 命令前面的那些字符串的结构,以 ’ 145 ’ 为例子, 描述出来就是" 空格开头+空格+数字+空格",空格与数字的 数量 为 >=1, 然后将 这种格式转换成 正则表达式:^匹配开头,空格 匹配空格,[[:digit:]] 匹配任意数字,* 这个符号表示 重复0次或者多次, 那么 匹配 字符串 ’ 145 ’ 的正则表达是
# ^+空格+* 表示 匹配 以一个或者多个空格开头, [[:digit:]]* 接表示多个数字,
# 空格+*,表示数字后面 还有 一个或者多个空格
"^ *[[:digit:]]* *"
# 使用 sed 命令的 's' 替换指令 将正则表达式匹配的内容替换成 空内容(相当于删除)
sed 's#^ *[[:digit:]]* *##' history.txt
展示一下命令执行前跟执行后的区别:
确认结果符合预期后,再加上 -i 参数修改 history.txt 文档 的内容。未加 -i 参数 只是 修改 sed 流里面的 内容,修改后的内容并未写入文档。
sed -i 's#^ [[:digit:]]* *##' history.txt
总结: sed 命令 的 ‘s’ 替换指令,配合正则表达式功能十分强大,sed 命令的基本用法可以参考之前写的另外的文章。要想灵活使用 sed 命令,就多多练习