sed批量替换多个文件内容

sed批量替换多个文件内容

1、问题:

批量生成的sql数据文件,SQL文件开始,为了提高效率需要将set timing on修改为set timing off
涉及文件数量超过两百个。

set feedback off
set define off
set echo off
set heading off
set timing on

2、解决:

通过sed解决。

(1)单个文件

做一个test.sql测试文件,内容如下:

set feedback off
set define off
set echo off
set heading off
set timing on

替换命令:

# sed -i "s/set timing on/set timing off/g" /script/program/test.txt

顺利实现。

(2)多个文件

第一次:

sed -i "s/set timing on/set timing off/g" `grep set timing on -rl /sqlscript/Thread`
#sed -i "s/set timing on/set timing off/g" `grep set timing on -rl /sqlscript/Thread
timing on -rl /sqlscript/Thread`
grep: timing: 没有那个文件或目录
grep: on: 没有那个文件或目录
grep: /sqlscript/Thread: 没有那个文件或目录
sed: 没有输入文件

第二次:
字符串空格用双引号:“set timing on”

 sed -i "s/set timing on/set timing off/g" `grep "set timing on" -rl /sqlscript/Thread`

由于每个sql文件都比较大,有几百兆,运行长时间无反应。

第三次
将g参数更换为1,不是全部更换,只更换第一次查询到的set timing on

sed -i "s/set timing on/set timing off/1" `grep "set timing on" -rl /sqlscript/Thread`

效率提高很多,但是也用了半个小时才完成。

3、sed参数

sed全称是:Stream EDitor

常用选项:
-e   --它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时使用
-f   --后跟保存了sed指令的文件
-i   --直接对内容进行修改,不加 i 时默认只是预览,不会对文件进行实际修改
-n   --取消默认输出,sed默认会输出所有文本内容,使用 -n 参数后只显示处理过的行
编辑命令:
a   --追加,向匹配行后插入内容
c   --更改,更改匹配行的内容
i   --插入,向匹配行前插入内容
d   --删除,删除匹配的内容
s   --替换,替换匹配到的内容
p   --打印,打印匹配到的内容,通常与 -n 和用
=   --用来打印被匹配到的行的行号
n  --读取下一行,遇到n时会自动跳入下一行
r,w   --读和写,r用于将内容读入文件,w用于将匹配内容写入到文件这里是引用

4、常用示例备查

sed -i "1ahello" 1.txt       --在第一行后面添加 “hello”,并保存修改
sed -i "/ab/ahello" 1.txt     --在内容ab后面添加 “hello”,并保存修改
sed "$ahello" 1.txt       --在最后一行添加 “hello”,可直接预览
 
sed -i "2ihello" 1.txt       --在第二行之前插入 “hello”
sed -i "/ab/ihello" 1.txt     --在包含“ab”的行之前插入“hello”,如果有多行,则每一行之前都会添加
 
sed -i "2chello" 1.txt       --将文件的第二行替换为“hello”
sed -i "/ab/chello" 1.txt     --将包含"ab"的行替换成“hello”
 
sed ‘1d’ 1.txt       --删除第一行
sed '1~2d' 1.txt       --从第一行开始删除,每隔两行就删除一行,即删除奇数行
sed '1,2d' 1.txt       --删除掉1~2行
sed ‘1,2!d’ 1.txt     --删除1~2之外的所有行
sed '$d' 1.txt       --删除掉最后一行
sed '/ab/d' 1.txt       --删除匹配“ab”的行
sed ‘/ab/,$d’ 1.txt       --删除从匹配“ab”的行到最后一行
sed ‘/ab/,+1d’ 1.txt       --删除从匹配“ab”的行及后面一行
sed ‘/^$/d’ 1.txt       --删除空行
sed '/ab\|12/!d' 1.txt     --删除不匹配12或ab的行,/ab\|12/表示匹配12或ab,!表示取反
sed '1,3{/ab/d}' 1.txt     --删除1~3行中,匹配内容‘ab的行
sed 's/12/hello' 1.txt     --将文中的’12‘替换成’hello‘,默认只替换每行第一个’12‘
sed ’s/12/hello/g‘ 1.txt     --将文中的所有’12‘都替换成’hello‘
sed 's/12/hello/2' 1.txt     --将每行中第二个匹配的’12‘替换成’hello‘
sed -n 's/12/hello/gpw 2.txt' 1.txt     --将每行中所有匹配的’12‘替换成’hello‘,并将替换后的内容写入2.txt
sed '/#/,.*//g' 1.txt       --匹配有#号的行,替换匹配行中逗号后的所有内容,(,.*)表示逗号后的所有内容
sed 's/..$//g' 1.txt       --替换每行中的最后两个字符为空,每个点代表一个字符
sed 's/^#.*//'  1.txt       --将#开头的行替换为空行,即注释的行
sed 's/^#.*//;/^$/d'  1.txt      --先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开
sed 's/^[0-9]/(&)/'   1.txt      --将每一行中行首的数字加上一个小括号   (^[0-9])表示行首是数字,&符号代表匹配的内容
sed  's/$/&'ha'/'  1.txt     --在1.txt文件的每一行后面加上"ha"字段
 
sed  -n '1p'  1.txt       --打印文件中的第一行内容
sed  -n '2~2p'  1.txt     --从第二行开始,每隔两行打印一行,波浪号后面的2表示步长
sed -n '$p'  1.txt       --打印文件的最后一行
sed -n '1,5p'  1.txt       --打印1到5行
sed  -n '5,$p'  1.txt       --打印从第5行到最后一行的内容
sed  -n '/you/p'  1.txt        --逐行读取文件,打印匹配you的行
sed  -n '/ab/,5p'  1.txt       --逐行读取文件,打印从匹配ab的行到第5行的内容
sed  -n '1,/ab/p'  1.txt        --打印第一行到匹配ab的行
sed  -n '/ab/,/ac/p'  1.txt       --打印从匹配内容ab到匹配内容ac的行
sed  -n "$="   1.txt         --打印1.txt文件最后一行的行号
ed  -n '/ab/='  1.txt         --打印匹配ab的行的行号
sed  -n '/ab/{=;p}'   1.txt        --打印匹配ab的行的行号和内容
sed  'r 2.txt'  1.txt           --将文件2.txt中的内容,读入1.txt中,会在1.txt中的每一行后都读入2.txt的内容
sed '1r 2.txt'  1.txt           --1.txt的第1行之后插入文件2.txt的内容
sed  '/ab/r   2.txt'   1.txt       --在匹配ab的行之后插入文件2.txt的内容,如果1.txt中有多行匹配ab则在每一行之后都会插入
sed  '$r  2.txt'   1.txt          --在1.txt的最后一行插入2.txt的内容
 
sed  -n  'w 2.txt'   1.txt         --将1.txt文件的内容写入2.txt文件,如果2.txt文件不存在则创建,如果2.txt存在则覆盖之前的内容
sed   -n '2w  2.txt'   1.txt         --将文件1.txt中的第2行内容写入到文件2.txt
sed  -n -e '1w  2.txt'  -e '$w 2.txt'   1.txt       --将1.txt的第1行和最后一行内容写入2.txt
sed  -n -e '1w  2.txt'  -e '$w  3.txt'  1.txt         --将1.txt的第1行和最后一行分别写入2.txt和3.txt
sed  -n  '/ab\|12/w  2.txt'    1.txt          --将1.txt中匹配ab或12的行的内容,写入到2.txt中
sed  -n '/ab/,$w 2.txt'   1.txt            --将1.txt中从匹配ab的行到最后一行的内容,写入到2.txt中
sed  -n  '/ab/,+2w  2.txt'     1.txt          --将1.txt中从匹配ab的行及其后2行的内容,写入到2.txt中

你可能感兴趣的:(Linux,Linux)