本文内容参考《Linux命令行与Shell脚本程序设计》一书总结一般文本数据data.txtJavaPythonGoC1。命令格式sed选项脚本文件2.替换命令[script][/match_word/][num]s/old_word/new_word/flags2。1命令说明:num[optional]:一个数字或区间,比如数字2,或者区间2、5,加上无穷大:$old_word:需要替换的内容new_word:替换后的内容flags:替换标志,默认number:1number,表示新文本将替换模式匹配处;g,表示新文本将替换所有匹配的文本;p,表示要打印原行的内容;可以结合-n参数避免打印w文件的原内容,将替换结果写入文件。2.2命令组合-e'[num]{s/old_word/new_word/flags;s/old_word2/new_word2/flags2}'3.删除命令[num]d或/match_word/d例:1./o/d2。2、3d输出:JavanewlineC3.1twotextmodeintervaldelete'/match_word/,/match_word2/d':如果match_word2不匹配,则match_word之后的所有数据都会被清除4.插入命令[num]i\insert_wordor[num]a\append_word例子:1.echo"Jim"|sed'i\Hello'2.echo"Hello"|sed'a\Jim'output:HelloNewlineJim,num可以在多行文本中选择插入某行,比如3iinsert_word,在第三行前插入insert_word5。修改命令[num]c\change_word或/match_word/c\change_word例子:1.sed'2c\C++'data.txt2。sed'/Python/c\C++'输出:Java换行符C++换行符Go换行符C6。转换命令[num]y/old_chars/new_chars/例子:sed'y/ao/LA/'data.txt输出:JLvLnewlinePythAnnewlineGAnewlineC,这里a对应L,o对应A、old_chars和new_chars的字符数必须相同,否则会出错sed'3y/ao/LA/'data.txtoutput:JavanewlinePythonnewlineGAnewlineC,optionnum,指定行或行间隔7.查看print[num][/match_word/]por[/match_word/]=Example:sed'/o/p'data.txtoutput:JavanewlinePythonnewlinePythonnewlineGonewlineGonewlineC,p命令会打印出原始数据,这里我们使用-n选项,输出可以是匹配的数据:PythonnGosed'/o/='data.txtoutput:Javanewline2newlinePythonnewline3newlineGonewlineC,这里可以打印匹配的行number,使用-n,可以忽略原始数据的输出8.写入文本[num][/match_word/]wfilename例子:sed-n'1,3wdata1.txt'data.txt结果:查data1.txt你会发现数据已经传输成功了。txt's1to3linesJavanewlinePythonPythonnewlineGowriteintodata1.txt9.move[num][/match_word/]nfilename例子:这里是移动到匹配行下一行的例子,结合删除sed'/Python/n;s/o/o,Jim/'data.txt结果:JavanewlinePythonnewlineGo,JimnewlineC,这里用一个分号表示两条命令10.合并下一行[num][/match_word/]Nfilename示例:将移动命令的小n替换为大Nsed'N;s/a.Py/-Jim-/'data.txt结果:Jav-Jim-thonnewlineGonewlineC,这里使用分号,表示两条命令重点详解match_wordPOSIX基本正则表达式(basicregularexpression,BRE)引擎支持的pattern^:linebeginningmatchexample:sed-n'/^J/p'data.txtoutput:Java,ifIf匹配语句改为:/^a/,则不会在行尾输出$:match例:sed-n'/a$/p'data.txt输出:Java,如果匹配语句为改成:/^Wa$/,不会有输出,因为行文必须是Wa[]:字符组匹配,[^]排除字符,[0-9]或[a-bc-z]区间示例:sed-n'[a-h]o'data.txt输出:PythonnewlineGo*:0ormorecharacters示例:echo'Jiiiiiiiiiiiim'|sed-n'/i*m$/p'输出:jiiiiiiiiiiiiiim,不管i有多少,都可以匹配到特殊字符组:[[:alpha:]]匹配任意字母字符,不管是大写还是小写[[:alnum:]]匹配任何字母数字字符0~9。A~Z或a~z[[:blank:]]匹配空格或制表符[[:digit:]]匹配0到9之间的数字[[:lower:]]匹配小写字母a~z[[:print:]]匹配任何可打印字符[[:punct:]]匹配标点符号[[:space:]]匹配任何空白字符:空格、制表符、NL、FF,VT,CR[[:upper:]]匹配任意大写字母字符A~Z
