比如,我想替换文件中的 properties 为 property ,可以使用
sed -i -n 's/properties/property/g' build.xml
ftp -in <<EOF
open 10.0.0.1
user uname passwd
$(sed 's/^/mput /' ftpfile.txt)
bye
EOF
使用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 !
使用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 !
sed编辑命令
p 打印匹配行
= 显示文件行号
a 在定位行号后附加新文本信息
i 在定位行号后插入新文本信息
d 删除定位行
c 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句
例子
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
1.简介
sed是源于行编辑器ed的非交互式的流(stream-oriented)编辑器。sed之所以称为“流”编辑器,是因为象大多数UNIX程序一样,输入流过它,然后被导向标准输出。sed编辑器逐行处理文件(或输入),把当前处理的行存储在称为“模式空间”(pattern space)的临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行后将其从模式空间中删除,然后读入下一行进行处理和输出。sed是对文件副本进行编辑和修改,所以不用担心会修改或破坏原文件。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作和编写转换程序等。
2. 使用格式
sed的使用格式如下:
sed [-n] [-e] ‘instruction’ file(s)
sed [-n] –f scriptfile file(s)
sed的instruction格式如下:
[address[,address]][!]command [arguments]
3.选项
sed的主要选项有:
| 选 项 |
功 能 |
| -n |
取消默认的输出 |
| -e |
允许多行编辑 |
| -f |
指定sed脚本文件名 |
| -i[SUFFIX] |
修改原文件,如果提供suffix,作备份 |
| -r |
使用扩展正则表达式 |
4. 指令地址
sed指令可以指定0、1或2个地址:
<!--[if !supportLists]-->0) <!--[endif]-->命令应用于所有行;
<!--[if !supportLists]-->1) <!--[endif]-->命令令应用于任何符合这一地址的行
<!--[if !supportLists]-->2) <!--[endif]-->命令应用与从第1个地址到第2个地址之间的行
5. 命令(command)
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]) |
5. sed正则表达式元字符
| 元字符 |
使 用 |
| . |
除换行(\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\>/ |
6. sed脚本编程
在命令行使用sed时常常会涉及到和shell的交互,而使用sed脚本则完全不必要为此操心。不再用引号来确保sed命令不被shell解释,而且可用反斜杠来续行。另外,对于脚本中的多个指令,应注意sed是对一行使用完了所有指令后再转到下一行的。sed的这种选择使得它可以方便地处理大文件(不必将整个文件一次读进内存)。另外,应注意sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。开始的{后不许有空格,结束的}必须单起一行。这一点与awk的比较自由的使用方式形成对比。sed中使用多行指令的示例如下:
/^\.TS/,/^\.TE/{
/^$/d
s/^\.ps 10/.ps 8/
s/^\.vs 12/.vs 10/
}
7. sed中使用shell变量
sed如何使用shell变量?
比如在shell中定义了一个var变量,如何在sed中调用此变量?可以考虑以下方法:
- 将平常的单引号改为双引号(Shell里单引号中所有字符都作字面解释):
sed "s/mytext/$var/g" file
对于某些mytext这种方法可能不起作用。
- 将一个单引号改为两个:
sed 's/mytext/'$var'/g' file
8.理解与补充说明
- grep与sed的区别。grep ‘John’ datafile对应的sed命令是sed –n ‘/John/p’ datafile。区别:
(1)使用grep时,正则表达式没有包含在//分隔符中,而sed需要包含在//之间;
(2)sed默认会输出每一行,所以需要用-n命令阻止默认输出;
(3)返回状态。如果grep在文件中找到指定模式,将返回状态0,否则返回1。sed则
不管是否找到指定模式,它的退出状态都是0,只有命令存在语法错误时,sed的
退出状态才不是0。
sed为什么要设计得如此“麻烦”呢?初用者在想只输出匹配行时往往忘记加-n选项。
这是因为sed首先是一个编辑器,而不是一个查找工具。比如当我们需要替换文件的
一部分时可以用不加-n选项的sed ‘s/a/b/g’ file实现。
- 比较sed与ed/vi。理解ed/vi的current-line addressing和sed的global line addressing非常重要:在ed/vi中使用定址来扩展命令处理行;而在sed中使用定址来限制处理的行。在ed/vi中,除非你告诉处理哪些行,不会处理什么,而在sed中,它将工作于每一行除非你告诉它不处理。
- 关于命令括在单引号中。这不是必须的,但是应养成总是这样做的良好习惯。单引号对可以避免shell解释在编辑指令中出现的特殊字符或空格(shell使用空格来分别提交给程序的不同参数,对于shell的特别字符在命令调用之前被扩展),所以当指令中存在空格时是必须使用单引号的。
- sed注释。#用来注释。System V只认第一列的#,而GNU sed则可以将#符号放在任何地方。但是注意,如果第一二个字符是#n 表示脚本不会自动输出结果,相当于指定了一个命令行参数-n。
- 在命令行中使用多指令的三种方法。(1)在指令之间加分号;(2)在每一指令之前加-e;(3)使用Shell的多行记录功能(前面加’后可以直接换行,shell会等待用户输入’后再解释。
- 最新版本的-i选项可以很方便地实现多文件直接修改,值得好好注意。
Shell中的grep、awk和sed的常用命令和语法
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对文件进行过滤,最好将问题分成几步,分步执行,且边执行边测试结果。
经验告诉我们,这是执行一个复杂任务的最有效方式。
- awk '/^$/{print NR}'
- sed -n '/^$/='
[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"
所以这样也可以实现楼主要求
来源:oschina
链接:https://my.oschina.net/u/66133/blog/42606