本文共 4196 字,大约阅读时间需要 13 分钟。
sed
sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可
能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。可以在命令行输入sed命令,也可以在一个文件中写入命令,然后调用sed,这与awk基本
相同。使用sed需要记住的一个重要事实是,无论命令是什么, sed并不与初始化文件打交道, 它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。 因为sed是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。调用sed有三种方式:在命令行键入命令;将sed命令插入脚本文件,然后调用sed;将sed
命令插入脚本文件,并使sed脚本可执行。使用sed命令行格式为:
sed [选项] sed命令输入文件。 记住在命令行使用sed命令时,实际命令要加单引号。sed也允许加双引号。使用sed脚本文件,格式为:
sed [选项] -f sed脚本文件输入文件 要使用第一行具有sed命令解释器的sed脚本文件,其格式为:sed脚本文件[选项] 输入文件
不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中 接受输入,一般是键盘或重定向结果sed选项:
n 不打印;sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以 用来打印编辑行。 c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条sed命令, 此选项无用,但指定它也没有关系。 f 如果正在调用sed脚本文件,使用此选项。此选项通知sed一个脚本文件支持所有的sed命令,例如:sed -f myscript.sed input_file,这里myscript.sed即为支持sed命令的文件。保存sed输出
由于不接触初始化文件,如果想要保存改动内容,简单地将所有输出重定向到一个文件即可.sed ‘command’inputfile > myoutfile
sed [-nefr]
-n 使用安静模式silent 在一般sed的用法中,所有来自STDIN的数据都会被列在屏幕上,但-n 只显示经过sed特殊处理的那一行 才会被列出来
-e 直接在命令行模式进行sed的编辑
-f 直接将sed的动作写在一个文件里,-f filename 则可以执行filename里的sed动作
-r sed的动作支持的是扩展型正则表达式语法
-i 直接修改读取的文件内容 而不是输出屏幕
使用sed在文件中查询文本的方式
1:使用行号,可以是一个简单数字,或是一个行号范围。
2:使用正则表达式x x为一行号,如1
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行 /pattern/ 查询包含模式的行。例如/disk/或/[a-z]//pattern/pattern/ 查询包含两个模式的行。例如/disk/disk/
pattern/,x 在给定行号上查询包含模式的行。如/ribbon/,3 x,/pattern/ 通过行号和模式查询匹配行。3./vdu/ x,y! 查询不包含指定行号x和y的行。1,2!基本sed编辑命令
p 打印匹配行
= 显示文件行号 a \ 在定位行号后附加新文本信息 下一行 i \ 在定位行号后插入新文本信息 上一行 d 删除定位行 c \ 用新文本替换定位文本s 使用替换模式替换相应模式
r 从另一个文件中读文本 w 写文本到一个文件 q 第一个模式匹配完成后推出或立即推出 l 显示与八进制ASCII代码等价的控制字符 { } 在定位行执行的命令组 n 从另一个文件中读文本下一行,并附加在下一行 g 将模式2粘贴到/pattern n/ y 传送字符 n 延续到下一输入行;允许跨行的模式匹配语句以lianxi.txt为例子:
lianxi.txt
The honetsuckle band played all night long for only $90. It was an evening of splendid music and company. Too Bad the disco floor fell through at 23:10. The local nurse Miss P.Neave was in attendance使用p显示行
sed '2p' lianxi.txt
原意只打印第二行,但是却打印了文件中所有行,为此需使用- n选项,显示打印定位(匹配)行。
sed -n '2p' lianxi.txt
打印范围
可以指定行的范围,现打印1到3行,用逗号分隔行号。sed -n '1,3p' lianxi.txt
打印模式 假定要匹配单词disco,并打印此行,方法如下。使用模式/pattern/格式,这里为/disco/。sed -n '/disco/'p lianxi.txt
使用模式和行号进行查询使用模式与行号的混合方式可以剔除第一行,格式为linenumber,/pattern/。逗号用来分
隔行号与模式开始部分。为达到预期结果,使用4,/The/。意即只在第四行查询模式the.sed -n '4,/The/p' lianxi.txt
匹配元字符
匹配元字符$前,必须使用反斜线\屏蔽其特殊含义。模式为/\$/p。sed -n '/\$/p' lianxi.txt
显示整个文件 要打印整个文件,只需将行范围设为第一行到最后一行1,$。 $意为最后一行。sed -n '1,$'p lianxi.txt
任意字符
匹配任意字母,后跟任意字母的0次或多次重复,并以ing结尾,模式为/.*ing/。可以使用这个模式查询以ing结尾的任意单词。sed -n '/.*ing/' lianxi.txt
首行和末行
sed -n '1p' lianxi.txt | sed -n '$p' lianxi.txt
打印行号
要打印行号,使用等号=。打印模式匹配的行号,使用格式/pattern/=。sed -n '/music/=' lianxi.txt
整个文件都打印出来,并且匹配行打印了行号。如果只关心实际行号,使用-e选项。sed -e '/music/=' lianxi.txt
如果只打印行号及匹配行,必须使用两个sed命令,并使用e选项。第一个命令打印模式
匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=。sed -n -e '/music/'p -e '/music/=' lianxi.txt
附加文本
要附加文本,使用符号a\,可以将指定文本一行或多行附加到指定行。 多行插入后边加上 \sed -i '/company/ a\ Then suddenly it happened' lianxi.txt
插入文本 在第4行下边插入 alca.lai
sed -i '4 i\ alca.lai ' lianxi.txt
替换文本 将alca.lai 替换成Kalpana
sed -i '/alca.lai/ c\ Kalpana' lianxi.txt
也可以使用行号直接代替:sed -i '3 c\ Kalpana' lianxi.txt
删除文本
sed -i '/kalpana/'d lianxi.txt
查找IP 以ifconfig 为例子
/sbin/ifconfig eth0 | grep "inet addr" | sed 's/^.*addr://g' |sed 's/Bcast.*$//g'
替换文本
替换文本
替换命令用替换模式替换指定模式,格式为: s/ pattern-to-find /replacement-pattern/[g p w n]查询出pattern-to-find 替换为replacement-pattern
后边选项:g p w n
替换选项如下:
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。 p 缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。-n选项不打印输出 结果。 w 文件名使用此选项将输出定向到一个文件。The 替换成Wow! 并将所改的行 另存到tihuan
nl lianxi.txt | sed -n 's/The/Wow!/w tihuan'
如果全部保存 可以使用追加导入
nl lianxi.txt | sed -n 's/The/Wow!/' > tihuan
大写替换小写
sed 's/\L[a-z]/\u&/g' lianxi3.txt
1)请把每个单词的第一个字母替换成大写。
sed 's/\b[a-z]/\u&/g
[解析]
\b大家应该知道是锚定的意思,说白了就是边界符,那么这就只会匹配第一个开头的字母,
\U的意思在元字符里的解释是“大写(不是标题首字符)\E 以前的字符”,
\u只是将下一个字符变为大写,注意它们的区别噢
\L的意思在元字符里的解释是全部换成小写
\l只是将下一个字符变为小写
2)全文大小写转换
echo "aBcDE" | tr a-z A-Z
echo "aBcDE" | tr A-Z a-z
3)大小写对换
echo "aBcDE" | tr '[a-zA-Z]' '[A-Za-z]