Shell编程—【07】Linux的sed流编辑器 sed命令

栏目: Python · 发布时间: 5年前

  • 下面命令将在含有file文件内容如下的目录下进行。
i love python
lovelove python
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*
复制代码

sed的选项使用案例

无参数直接使用p(打印)命令

sed "p" file
复制代码
i love python
i love python
lovelove python
lovelove python
loooove
loooove
I LOVE PYTHON
I LOVE PYTHON
I LOVE pYtHoN
I LOVE pYtHoN
py.*
py.*
复制代码

-n 取消自动打印模式空

  • 可能大家会有点蒙是什么意思,这句话是centOS7中世界输入sed给的提示。
  • 首先解释一下,使用sed命令时,会先自动打印原来的文本,再输出匹配文本处理结果。
  • -n大家可以简单理解不输出原文本,只输出结果。
  • 示例:
sed -n "p" file
复制代码
i love python
lovelove python
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*
复制代码
  • 打印匹配项
sed -n "/python/p" file
复制代码
i love python
lovelove python
复制代码

-e 脚本, 添加“脚本”到程序的运行列表

  • 就是在逐行处理的时候匹配有多种情况,只有一个不用写-e
  • 如 匹配大写的和小写的
sed -n -e '/python/p' -e '/PYTHON/p' file
复制代码
i love python
lovelove python
I LOVE PYTHON
复制代码

-r 使用拓展正则表达式

sed -nr "/python|PYTHON/p" file
sed -nE "/python|PYTHON/p" file
# 两种都可以
复制代码
i love python
lovelove python
I LOVE PYTHON
复制代码

-f 脚本文件, 添加“脚本文件”到程序的运行列表

-i 操作源文件

sed -i 's/love/like/g' file
# s是替换 love变成like  g是每行的所有匹配字符,
# 如果不加g 则会匹配到第一个符合的字符替换了就结束当前行的替换
复制代码
  • 没有输出

sed常用的Pattern用法

匹配某行

sed -n "5p" file
复制代码
I LOVE pYtHoN
复制代码

从某行开始匹配到某行

sed -n '2,5p' file
复制代码
lovelove python
loooove
I LOVE PYTHON
I LOVE pYtHoN
复制代码

从某行开始匹配 并设置一个偏移行数

sed -n '2,+2p' file
复制代码
  • 处理的行数是从基数开始 偏移量+1 行
lovelove python
loooove
I LOVE PYTHON
复制代码

处理正则表达式所在的行

sed -n '/^I LOVE/p' file
复制代码
I LOVE PYTHON
I LOVE pYtHoN
复制代码

从匹配条件1到的行数开始到 条件2的行 结束

sed -n "/lovelove/,/py\.\*/p" file
复制代码
lovelove python
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*
复制代码

从某行开始到 匹配条件2的行 结束

sed -n "4,/pYtHoN/p" file
复制代码
I LOVE PYTHON
I LOVE pYtHoN
复制代码

从匹配条件1到的行数开始到 某行 结束

sed -n "/pYtHoN/, 6s/LOVE/love/gp" file
复制代码
I love pYtHoN
复制代码

注意: 如果是行数范围处理,结束条件如果文件中没有那么就会一直处理到最后一行

sed -n "3,/abc/p" file
复制代码
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*
复制代码

sed中的编辑命令

p 打印 print

a 行后追加append

sed '/loooove/a bbbbbbbbbb' file
复制代码
i love python
lovelove python
loooove
bbbbbbbbbb
I LOVE PYTHON
I LOVE pYtHoN
py.*
复制代码

i 行前追加

sed '/loooove/i aaaaaaaaa' file
复制代码
i love python
lovelove python
aaaaaaaaa
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*
复制代码

r 外部文件读入,行后追加

  • list文件
1 line
2 line
复制代码
sed '/lovelove/r list' file 
复制代码
i love python
lovelove python
1 line
2 line
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*
复制代码

w 匹配行写入外部文件

sed -n '/I LOVE/w aaa' file  && cat aaa```
复制代码
  • 注意aaa可以不存在 如果以存在 里面的内容会被清除
I LOVE PYTHON
I LOVE pYtHoN
复制代码

d 删除

sed '1,3d' file
复制代码
  • 执行打印 并不修改源文件 修改源文件需要-i
I LOVE PYTHON
I LOVE pYtHoN
py.*
复制代码

s/old/new 替换行内第一个old

s/old/new/2 替换行第二个

s/old/new/g 替换行内所有old

s/old/new/2g 替换第二个及后面所有的

s/old/new/ig 替换行内所有的old,忽略大小写

  • 替换命令演示
sed 's/o/AA/i2g' file
复制代码
i love pythAAn
lovelAAve pythAAn
loAAAAAAve
I LOVE PYTHAAN
I LOVE pYtHAAN
py.*
复制代码
sed 's/py/&OOO/ig' file
复制代码
  • & 符号是匹配的内容的引用
i love pyOOOthon
lovelove pyOOOthon
loooove
I LOVE PYOOOTHON
I LOVE pYOOOtHoN
pyOOO.*
复制代码

sed的应用

  • 处理一个 Mysql 的配置文件my.conf文本,输入文章有几个段(以 [ ] 为段),每个段有几个配置,
#!/bin/bash
#

FILE_NAME=./my.cnf

function get_all_segments
{
	echo "`sed -n '/\[.*\]/p' $FILE_NAME  | sed -e 's/\[//g' -e 's/\]//g'`"
}

function count_items_in_segment
{
	items=`sed -n '/\['$1'\]/,/\[.*\]/p' $FILE_NAME | grep -v "^#" | grep -v "^$" | grep -v "\[.*\]"`
	
	index=0
	for item in $items
	do
		index=`expr $index + 1`
	done

	echo $index

}

number=0

for segment in `get_all_segments`
do
	number=`expr $number + 1`
	items_count=`count_items_in_segment $segment`
	echo "$number: $segment  $items_count"
done
复制代码
  • 文本my.conf
# this is read by the standalone daemon and embedded servers
[client]
port=3306
socket=/tmp/mysql.socket

#ThisSegmentForserver
[server]
innodb_buffer_pool_size=91750M
innodb_buffer_pool_instances=8
innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_dump_at_shutdown=1
innodb_data_file_path=ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=32M
innodb_log_file_size=2G
innodb_log_files_in_group=2
innodb_max_undo_log_size=4G
innodb_undo_directory=undolog
innodb_undo_tablespaces=95

#thisisonlyforthemysqldstandalonedaemon
[mysqld]
port=3306
socket=/tmp/mysql.sock
basedir=/usr/local/mysql
datadir=/data/mysql
pid-file=/data/mysql/mysql.pid
user=mysql
bind-address=0.0.0.0
sort_buffer_size=16M
join_buffer_size=16M
thread_cache_size=3000
interactive_timeout=600
wait_timeout=600

#ThisSegmentFormysqld_safe
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
max_connections=1000
open_files_limit=65535
thread_stack=512K
external-locking=FALSE
max_allowed_packet=32M

#thisisonlyforembeddedserver
[embedded]
gtid_mode=on
enforce_gtid_consistency=1
log_slave_updates
slave-rows-search-algorithms='INDEX_SCAN,HASH_SCAN'
binlog_format=row
binlog_checksum=1
relay_log_recovery=1
relay-log-purge=1


#usethisgroupforoptionsthatolderserversdon'tunderstand
[mysqld-5.5]
key_buffer_size=32M
read_buffer_size=8M
read_rnd_buffer_size=16M
bulk_insert_buffer_size=64M
myisam_sort_buffer_size=128M
myisam_max_sort_file_size=10G
myisam_repair_threads=1
lock_wait_timeout=3600
explicit_defaults_for_timestamp=1
innodb_file_per_table=1

复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java Servlet & JSP Cookbook

Java Servlet & JSP Cookbook

Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99

With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具