sed增删改查,sed 查找替换
Sed学习笔记canhui87
参恢87
数据分析
如果想用Shell灵活处理文本文件,必须学习sed和awk命令。Sed命令很强大,但是选项很多,脚本可读性差(一堆对角线组合),还有很多不常用的函数(比如模式空间)。如果你想用它们,你必须再查一下书。所以把常用的命令写下来,以便快速参考。
注:这是我个人的学习笔记,很多都是为了自己的工作方便查阅,可读性一般。有awk命令的后续学习笔记。想系统学习sed命令的人,建议阅读以下书籍。
主要参考:
《Linux命令行与shell脚本编程大全(第3版)》
《sed与awk(第二版)》
1常用sed命令sed -n /root/p mylog.txt:输出行sed /root/d mylog.txt:删除sed -n s/root/my/p mylog.txt:替换并输出sed s/root/my/g mylog.txt:全局默认情况下,每行只替换第一个sed s/root/my/ mylog.txt:引用匹配模式sed-e s/root/my/-e s/2015/2015txt:将所有文件替换为逗号sed-is///g mylog.txt:在开头添加竖线sed -i s/$//g mylog.txt:在结尾添加竖线sed-I 1d aug _ unlimited _ output . CSV。r//g test . txt:delete carriage return 2 sed运行模式sed运行模式:流编辑命令,一次读取一行数据,保存在缓存区,根据命令匹配数据,处理数据并输出,删除缓存。
命令:sed[选项]操作[文件]
2.1选项e执行脚本,可用于处理多个命令。
-f执行脚本文件
-n只输出符合规则的行。默认情况下,会输出源文件的每一行,然后输出匹配的行。
-我写回原始文件,替换并删除它。
-r扩展正则语法,默认为普通正则语法。
-l输出文件名
#-e多个命令
sed-e s/brown/gree/-e s/dog/cat/ my log . txt sed-e s/brown/gree/;s/dog/cat/ my log . txtsed-ne s/brown/gree/;s/dog/cat/p my log . txt sed-e 2 { s/brown/gree/s/dog/cat/} my log . txt #跨线命令组合2.2动作动作:寻址文本过滤/动作/查找/替换/标记
s:替换p:打印q:退出d,d:删除I:插入到上一行a:添加到下一行c:替换行y:映射n,n:下一行2.3替换标记s/查找/替换/标记无标记:默认替换第一位
编号:更换指定位置。
g:替换所有P: print,通常结合-n选项W:将匹配结果输出到新文件R:读取文件sed的/brown/gree/GW new log . txt my log . txt 2.4特殊字符反斜杠:
Sed的/,// mylog.txt #逗号被替换为竖线sed的!!Mylog.txt 2.5寻址#行寻址
sed 2s/dog/cat/ my log . txt # Line 2 sed 1,3s/dog/cat/ my log . txt # Line 1-3 sed 2,$ s/dog/cat/ my log . txt # Line 2 Start #模式寻址,文本过滤/过滤/s
sed /dog1/s/dog/cat/ my log . txt #仅用dog 1替换行。Sed 2,3 {/dog/s/dog/cat/} mylog.txt #行寻址模式寻址sed /dog/{2,3s/dog/cat/} mylog.txt #模式寻址行寻址2.6删除可以与寻址文本过滤模式sed d mylog.txt #删除所有行sed 1d mylog.txt #删除第一行sed 2,$ d my log . txt sed /dog 1/d my log . txt #删除包含dog的行sed 2 测试行2 # Insert echo testline 1 sed a testline 2 #并在其后添加sed 1inew line 1 mylog.txt #,并在最后一行插入sed $ a New line 1 my log . txt # Insert 2.8以修改整行内容sed 2c change line 2 my log . txt # addressing sed /dog 2/c change 2 my log . txt # text filtering 2.9 mapping替换相应的位置字符sed y/123/abc/ S/dog1/cat1/p} mylog.txt #显示brown 1 fox lazy dog 1 brown 1 fox lazy cat 1修改前后使用= mylog.txt #打印行号sed = my log . txt sed N;s/ n/ #与cat -n mylog.txt 3 sed高级命令3.1多行命令# n找到匹配的行并切换到下一行。
sed /dog 1/{ n;D} mylog.txt #删除指定行sed /dog 1/{ N;D} mylog.txt #删除两行sed /dog 1/{ N;D} mylog.txt #删除第一行# n找到匹配行后,将下一行添加到当前行
sed /dog 1/{ N;S/n//} mylog.txt #合并2行,删除换行符3.2排除命令sed -n /dog1/!p mylog.txtsed -n $!n;s/懒狗/懒猫/ mylog.txt #最后一行不合并3.3分支标签[地址]b[标签] sed {2,3b;S/dog/cat/} mylog.txt #b,不带标签,直接跳到sed {/A/b lab 1;s/狗/猫/;lab1s/dog/pig/} my log . txt # if a:s/dog/pig/else:s/dog/cat/3.4 test[address]t[label]sed { s/dog 1/cat/;t;S/dog/pig/} mylog.txt #如果不匹配,跳转到tag 3.5循环#一次替换一个逗号。
echo This,is,a,test“ sed-n ”:start;s/,//1p;/,/b start} # while /,/: s/,//echo This,is,a,test sed-n :start;s/,//1p;T} 这是,a,test这是,test这是test3.6模式参考数字回显猫睡在他的帽子里 sed的/。在//g 猫睡在他的帽子里。“猫睡在他的帽子里。” sed的/(。at ) sleep/big 1/g 帽子里的大猫。4 space 4.1模式空间,保持空间模式空间:处理每行的临时缓冲区,处理完每行后打印缓冲区,清空缓存。
Hold space:一个特殊的缓冲区,初始化为空行,不会主动打印或自动清空,需要特定的命令。
d:删除模式空间
p:打印模式空间
H,H:保存、复制模式空间并将其追加到保存空间。
g,g:获取、复制保存空间并将其附加到模式空间。
x:交换模式空间和保存空间内容
sed-n“{ 1!g;h;$p} mylog.txt #与tac mylog.txtsed 1!g;h;$!D mylog.txt #以逆序打印sed g my log . txt #添加一个空行sed $!每行之后!G mylog.txt #每行之间加一个空行,最后一行不加sed x;p;X mylog.txt #添加一个空行sed 1!{ x;p;X} mylog.txt #每行前加一个空行,第一行不加4.2替换换行符sed :loop;n;$!b循环;S/ n/-/g mylog.txt #合并所有行4.3合并非-结束换行echo 59659781 ,汕头11号, 11号, 7 33863381,汕头1号, 1号, 7 /$/!n;/$/!b循环;S/ n/-/g loupan.csv4.4替换line breaks python版本#用sed space模式循环每一行,逻辑复杂,不同shell版本处理效果不一样,这样复杂的逻辑还是用python处理比较好。
#用python熊猫读取csv,并替换换行符
导入熊猫为pddf=pd.read_csv(add.csv ,header=None)for I in range(df . shape[1]):if df . dtypes[I]= object :df[I]=df[I]. str . replace( r n ,)df.to _ csv (pd.csv ,index=none,header=none) 5 ksh版sed命令Linux默认shell版本为bash,AIX默认shell版本为ksh,ksh版sed命令的功能比bash差很多
# No I命令,修改只能重定向到新文件。
sed-e s/$//g test . txttest 1 . txt #回车和换行符等特殊字符必须使用echo命令。
sed-e s/` echo r `//g test . txt test1 . txt