使用s e d在文件中定位文本的方式 php
x x为一行号,如1
x , y 表示行号范围从x到y,如2,5表示从第2行到第5行
/ p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 经过行号和模式查询匹配行。3 . / v d u /
x , y ! 查询不包含指定行号x和y的行。1 , 2 ! html
使用s e d在文件中定位文本的方式 正则表达式
x x为一行号,如1
x , y 表示行号范围从x到y,如2,5表示从第2行到第5行
/ p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/
/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n / 经过行号和模式查询匹配行。3 . / v d u /
x , y ! 查询不包含指定行号x和y的行。1 , 2 ! shell
sed编辑命令 编程
p 打印匹配行
= 显示文件行号
a 在定位行号后附加新文本信息
i 在定位行号后插入新文本信息
d 删除定位行
c 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另外一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或当即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 从另外一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;容许跨行的模式匹配语句 app
例子
sed -n '2p' file.txt //打印第二行
sed -n '1,4p' file.txt //print 1-4 line
sed -n '1,$p' file.txt //print all 编辑器
sed -n '/require/'p cart.php /匹配require
sed -n '/$/'p cart.php /匹配$特殊字符 要用
sed -n '/.*uire/'p cart.php
sed -n -e '/require/p' -e '/require/=' cart.php //匹配require 而且打印行号
sed -n '/require/=' cart.php //只打印匹配的行号 工具
替换命令用替换模式替换指定模式,格式为:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
s选项通知s e d这是一个替换操做,并查询p a t t e r n - t o - f i n d,成功后用r e p l a c e m e n t - p a t t e r n替
换它。
替换选项以下:
g 缺省状况下只替换第一次出现模式,使用g选项替换全局全部出现模式。
p 缺省s e d将全部被替换行写入标准输出,加p选项将使- n选项无效。- n选项不打印输出
结果。
w 文件名使用此选项将输出定向到一个文件。 学习
sed 's/class/CLASS/' cart.inc 例如:
sed 's/class/CLASS/g' cart.inc //替换全部的匹配项目 测试
sed 's/class/CLASS/w cart.inc' out.file //替换后的结果输出到 out.file中
sed '/require./r cart.php' 1.php //把cart.php文件中/require 后面的数据添加到1.php以前。
sed 's/##*//g' 1.php //把1.php文件中全部##替换成空格。
sed 's/^0*//g' 1.php //把行首的0设为空。
sed 's/^M//g' 1.php //除去控制字符^M 键。
^M 的产生 ,<ctrl>+V 按J
^[[ 的产生 <ctrl>+V + 方向键 <-
处理报文输出
1) 使用s/-*//g删除横线- - - - - -。
2) 使用/^$ / d删除空行。
3) 使用$d删除最后一行
4) 使用1d删除第一行。
5) 使用awk {print $1}打印第一列。
命令以下,这里使用了cat,并管道传送结果到sed命令
cat cart.php |sed 's/--*//g' | sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'
快速一行命令
下面是一些一行命令集。([ ]表示空格, [ ]表示t a b键)
‘s / . $ / / g’ 删除以句点结尾行
‘-e /abcd/d’ 删除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
‘s / ^ [ ] [ ] * / / g’ 删除行首空格
‘s / . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/ ^ $ / d’ 删除空行
‘s / ^ . / / g’ 删除第一个字符
‘s /CO L ( . . . ) / / g’ 删除紧跟C O L的后三个字母
‘s / ^ / / / g’ 从路径中删除第一个
‘s / [ ] / [ ] / / g’ 删除全部空格并用t a b键替代
‘S / ^ [ ] / / g’ 删除行首全部t a b键
‘s / [ ] * / / g’ 删除全部t a b键
——————————————————————————————————
sed命令学习笔记收藏
http://victoryseason.blog.sohu.com/110677264.html
sed是源于行编辑器ed的非交互式的流(stream-oriented)编辑器。sed之因此称为“流”编辑器,是由于象大多数UNIX程序同样,输入流过它,而后被导向标准输出。sed编辑器逐行处理文件(或输入),把当前处理的行存储在称为“模式空间”(pattern space)的临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行后将其从模式空间中删除,而后读入下一行进行处理和输出。sed是对文件副本进行编辑和修改,因此不用担忧会修改或破坏原文件。sed主要用来自动编辑一个或多个文件,简化对文件的反复操做和编写转换程序等。
sed的使用格式以下:
sed [-n] [-e] ‘instruction’ file(s)
sed [-n] –f scriptfile file(s)
sed的instruction格式以下:
[address[,address]][!]command [arguments]
sed的主要选项有:
选 项 |
功 能 |
-n |
取消默认的输出 |
-e |
容许多行编辑 |
-f |
指定sed脚本文件名 |
-i[SUFFIX] |
修改原文件,若是提供suffix,做备份 |
-r |
使用扩展正则表达式 |
sed指令能够指定0、1或2个地址:
<!--[if !supportLists]-->0) <!--[endif]-->命令应用于全部行;
<!--[if !supportLists]-->1) <!--[endif]-->命令令应用于任何符合这一地址的行
<!--[if !supportLists]-->2) <!--[endif]-->命令应用与从第1个地址到第2个地址之间的行
sed的命令主要有:
命 令 |
功 能 |
d |
删除行 |
p |
打印行 |
! |
对所选行以外的全部行应用命令 |
= |
打印行号 |
s |
替换命令(如’s/^west/north/g’)注意查找替换分隔符没必要是’/’,而能够是换行符和反斜线外的任何字符(如s#^west#north#g) |
r |
读文件 |
w |
写文件 |
a\ |
在当前行后添加一行或多行 |
i\ |
在当前行以前插入文本 |
c\ |
用新文本代替当前行中的文本 |
l |
显示模式空间中的内容,显示非打印字符为两字节ASCII码 |
y |
将一字符转换为另外一字符(如:[address]y/abc/xyz/) |
n |
读入下一行,并将其读入模式缓冲区中,任何命令都将应用于下一行 |
q |
结束或退出sed |
D |
删除多行pattern space中到\n为止 |
N |
将下一行附加到上一行 |
P |
打印到多行pattern space的\n为止 |
H(h) |
Hold命令,附加(H)或拷贝(h)pattern space的内容到hold space(暂存区) |
G(g) |
Get命令,附加(拷贝)暂存区的内容到pattern space |
x |
Exchange命令,互换hold space和pattern space的内容 |
b |
Branch(跳转)命令([address]b[label]) |
t |
Test(测试)命令([address]t[label]) |
元字符 |
使 用 |
. |
除换行(\n)以外的任何字符 |
* |
匹配0或多个前导字符,至关于\{0,\} (如:/*love/) |
+ |
匹配1或多个前导字符,至关于\{1,\} 注意这是扩展元字符 |
[...] |
匹配指定字符组内的任一字符 (如:/[Ll]ove/ |
\{n,m\} |
匹配至少n个,至多m个前导字符;\{n\} 将匹配正好 n个, \{n,\}将匹配至少n个 (如:/o\{5,10\}) |
^ |
行首定位符 |
$ |
行尾定位符 |
\ |
取消转义字符 |
\( \) |
保存已匹配的字符,最多可定义9个标签(如:s/\(love\)able/\1er/) |
\n |
获取以上获取的第n个标签 |
& |
保存查找串以便在替代串中引用 (如 s/love/**&**/g) |
\< |
词首定位符 /\<love/ |
\> |
词尾定位符 /love\>/ |
在命令行使用sed时经常会涉及到和shell的交互,而使用sed脚本则彻底没必要要为此操心。再也不用引号来确保sed命令不被shell解释,并且可用反斜杠来续行。另外,对于脚本中的多个指令,应注意sed是对一行使用完了全部指令后再转到下一行的。sed的这种选择使得它能够方便地处理大文件(没必要将整个文件一次读进内存)。另外,应注意sed对于脚本中输入的命令很是挑剔,在命令的末尾不能有任何空白或文本,若是在一行中有多个命令,要用分号分隔。开始的{后不准有空格,结束的}必须单起一行。这一点与awk的比较自由的使用方式造成对比。sed中使用多行指令的示例以下:
/^\.TS/,/^\.TE/{ /^$/d s/^\.ps 10/.ps 8/ s/^\.vs 12/.vs 10/ }
sed如何使用shell变量?
好比在shell中定义了一个var变量,如何在sed中调用此变量?能够考虑如下方法:
sed "s/mytext/$var/g" file
对于某些mytext这种方法可能不起做用。
sed 's/mytext/'$var'/g' file
(1)使用grep时,正则表达式没有包含在//分隔符中,而sed须要包含在//之间;
(2)sed默认会输出每一行,因此须要用-n命令阻止默认输出;
(3)返回状态。若是grep在文件中找到指定模式,将返回状态0,不然返回1。sed则
不论是否找到指定模式,它的退出状态都是0,只有命令存在语法错误时,sed的
退出状态才不是0。
sed为何要设计得如此“麻烦”呢?初用者在想只输出匹配行时每每忘记加-n选项。
这是由于sed首先是一个编辑器,而不是一个查找工具。好比当咱们须要替换文件的
一部分时能够用不加-n选项的sed ‘s/a/b/g’ file实现。
Grep的经常使用命令语法1. 双引号引用和单引号引用
在g r e p命令中输入字符串参数时,最好将其用双引号括起来。例如:”m y s t r i n g”。这样作有两个缘由,一是以防被误解为 s h e l l命令,二是能够用来查找多个单词组成的字符串,例如:”jet plane”,若是不用双引号将其括起来,那么单词 p l a n e将被误认为是一个文件,查询结果将返回”文件不存在”的错误信息。
在调用变量时,也应该使用双引号,诸如: g r e p”$ M Y VA R”文件名,若是不这样,将
没有返回结果。
在调用模式匹配时,应使用单引号.[root@mypc ]# echo `grep 123 111.txt` (#注意是反单引号)
2. 经常使用的g r e p选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的全部行。
3. 特殊的–在多个文件中进行查询
$ grep “sort”*.doc ( #在当前目录下全部. d o c文件中查找字符串”s o r t”)
$ grep “sort it” * (#或在全部文件中查询单词”sort it”)
接下来的全部示例是指在单个文件中进行查询
4. 行匹配
$ grep -c “48″ data.f
$ 4 (#g r e p返回数字4,意义是有4行包含字符串”4 8″。)
$ grep “48″ data.f (#显示包含”4 8″字符串的4行文本)
5. 显示知足匹配模式的全部行行数:
[root@mypc oid2000]# grep -n 1234 111.txt
1:1234
3:1234ab
6. 精确匹配
[root@mypc oid2000]# grep “1234\>” 111.txt
1234
7. 查询空行,查询以某个条件开头或者结尾的行。
结合使用^和$可查询空行。使用- n参数显示实际行数
[root@mypc oid2000]# grep -n “^$” 111.txt (返回结果 2: #说明第二行是空行)
[root@mypc oid2000]# grep -n “^abc” 111.txt (#查询以abc开头的行)
[root@mypc oid2000]# grep -n “abc$” 111.txt (#查询以abc结尾的行)
8. 匹配特殊字符,查询有特殊含义的字符,诸如$ . ‘ ” * [] ^ | \ + ? ,必须在特定字符前加\。
[root@mypc oid2000]# grep “\.” 111.txt (#在111.txt中查询包含”.”的全部行)
[root@mypc oid2000]# grep “my\.conf” 111.txt (#查询有文件名my. c o n f的行)
9. 目录的查询
[root@mypc oid2000]# ls -l |grep “^d” (#若是要查询目录列表中的目录)
[root@mypc oid2000]# ls -l |grep “^d[d]” (#在一个目录中查询不包含目录的全部文件)
[root@mypc]# ls -l |grpe “^d…..x..x” (#查询其余用户和用户组成员有可执行权限的目录集合)
Awk的经常使用命令语法
awk命令擅长格式化报文或从一个大的文本文件中抽取数据包,下面是该命令的基本语法
awk [-F filed-separator] “commands” input-file(s)
[ - F域分隔符]是可选的,a w k使用空格做为缺省的域分隔符,若是在要处理的文件中是以冒号做为分割域的(如passwd文件),则在处理的时候要这样指明 awk -F: command input-file(s)
1.1域和记录
a w k执行时,其浏览域标记为$ 1,$ 2 . . . $ n。这种方法称为域标识。使用$ 1 , $ 3表示参照第1和第3域,注意这里用逗号作域分隔。若是但愿打印一个有 5个域的记录的全部域,没必要指明 $ 1 , $ 2 , $ 3 , $ 4 , $ 5,可以使用$ 0,意即全部域。
1.2保存a w k输出
$ awk ‘{print $0}’ input-files > out-files (#重定向保存输出)
$ awk ‘{print $0}’ input-files | tee out-files (#使用t e e命令,输出到文件的同时输出到屏幕)
1.3 经常使用的awk命令举例
[root@mypc /]# awk ‘$0 ~ /user/’ /etc/passwd (#若是某域含有user就将该行打印出来)
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@mypc /]# awk ‘/user/’ /etc/passwd (#同上)
[root@mypc /]# awk -F: ‘{if ($5 ~ /user/) print $0}’ /etc/passwd (#如第五域有user则输出该行)
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
[root@mypc /]# ifconfig | awk ‘/inet/{print $2}’ (#从ifconfig的输出中抽取含inet的行并打印第二域)
[root@mypc /]# ifconfig | awk ‘/inet/{print $2}’ | awk -F: ‘{print $2}’ (#在上面的基础上再抽取,这个命令可让你直接获得本机的ip地址)
Sed的经常使用命令语法
Sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。
1.行的匹配
[root@mypc /]# sed -n ‘2p’ /etc/passwd 打印出第2行
[root@mypc /]# sed -n ‘1,3p’ /etc/passwd 打印出第1到第3行
[root@mypc /]# sed -n ‘$p’ /etc/passwd 打印出最后一行
[root@mypc /]# sed -n ‘/user/’p /etc/passwd 打印出含有user的行
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@mypc /]# sed -n ‘/\$/’p /etc/passwd 打印出含有$元字符的行,$意为最后一行
2.插入文本和附加文本(插入新行)
[root@mypc /]# sed -n ‘/FTP/p’ /etc/passwd 打印出有FTP的行
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@mypc /]# sed ‘/FTP/ a\ 456′ /etc/passwd 在含有FTP的行后面新插入一行,内容为456
[root@mypc /]# sed ‘/FTP/ i\ 123′ /etc/passwd在含有FTP的行前面新插入一行,内容为123
[root@mypc /]# sed ‘/FTP/ i\ “123″‘ /etc/passwd在含有FTP的行前面新插入一行,内容为”123″
[root@mypc /]# sed ‘5 a\ 123′ /etc/passwd 在第5行后插入一新行,内容为123
[root@mypc /]# sed ‘5 i\ “12345″‘ /etc/passwd 在第5行前插入一新行,内容为”12345″
3.删除文本
[root@mypc /]# sed ‘1d’ /etc/passwd 删除第1行
[root@mypc /]# sed ‘1,3d’ /etc/passwd 删除第1至3行
[root@mypc /]# sed ‘/user/d’ /etc/passwd 删除带有user的行
4. 替换文本,替换命令用替换模式替换指定模式,格式为:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
[root@mypc /]# sed ’s/user/USER/’ /etc/passwd 将第1个user替换成USER,g代表全局替换
[root@mypc /]# sed ’s/user/USER/g’ /etc/passwd 将全部user替换成USER
[root@mypc /]# sed ’s/user/#user/’ /etc/passwd 将第1个user替换成#user,如用于屏蔽做用
[root@mypc /]# sed ’s/user//’ /etc/passwd 将第1个user替换成空
[root@mypc /]# sed ’s/user/&11111111111111/’ /etc/passwd 若是要附加或修改一个很长的字符串,可使用( &)命令,&命令保存发现模式以便从新调用它,而后把它放在替换字符串里面,这里是把&放前面
[root@mypc /]# sed ’s/user/11111111111111&/’ /etc/passwd 这里是将&放后面
5. 快速一行命令
下面是一些一行命令集。([ ]表示空格,[ ]表示t a b键)
‘s / \ . $ / / g’ 删除以句点结尾行
‘-e /abcd/d’ 删除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
‘s / ^ [ ] [ ] * / / g’ 删除行首空格
‘s / \ . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/ ^ $ / d’ 删除空行
‘s / ^ . / / g’ 删除第一个字符
‘s /COL \ ( . . . \ ) / / g’ 删除紧跟C O L的后三个字母
‘s / ^ \ / / / g’ 从路径中删除第一个\
‘s / [ ] / [ ] / / g’ 删除全部空格并用t a b键替代
‘S / ^ [ ] / / g’ 删除行首全部t a b键
‘s / [ ] * / / g’ 删除全部t a b键
若是使用s e d对文件进行过滤,最好将问题分红几步,分步执行,且边执行边测试结果。
经验告诉咱们,这是执行一个复杂任务的最有效方式。
[root@localhost ~]# nl test.txt
1 hahahaha
2 aaaaaaa
3 aaaaaaa
4 bbbbbbbbbbbbb
5 vvvvvvvv
6 ddddddddd
7 vvvvvvvv
8 aaaaaaa
9 bbbbbbbbbbbbb
10 ddddddddddd
11 $
12 #
13 345
14 345
15 a5^
[root@localhost ~]# nl test.txt | grep -vn "[1-9]"
4:
[root@localhost ~]#
nl 文件名
默认就会加行号显示.空白行不加行号.
若是须要空白行也加行号能够输入
nl -b a 文件名
若是要自动把行号前面用0填充能够
[root@localhost ~]# nl -n rz test.txt
000001 hahahaha
000002 aaaaaaa
000003 aaaaaaa
000004 bbbbbbbbbbbbb
000005 vvvvvvvv
000006 ddddddddd
000007 vvvvvvvv
000008 aaaaaaa
000009 bbbbbbbbbbbbb
000010 ddddddddddd
000011 $
000012 #
000013 345
000014 345
000015 a5^
[root@localhost ~]#
-w 后面能够决定填充几个0.能够本身试试。。
nl -n rz -w 4 test.txt|grep -nv "^0"
因此这样也能够实现楼主要求