`

sed处理文本方法

阅读更多
转载至http://lht821008.blog.163.com/blog/static/416478620110411959705/
#删除每一行开头的空白 (空格,TAB)左对齐排列全文.
sed 's/^[ \t]*//'
### 替换成空,^[ \t]* 的含义为以空格或者TAB键开始的(或者是他们的组合)行.

#从每一行结尾处删除最后的空格(空格,TAB)
sed 's/[ \t]*$//'

#删除每一行的开头和结尾的空格
sed 's/^[ \t]*//;s/[ \t]*$//'

#在每一行开始处插入5个空格(整页偏移)
sed 's/^/ /'

#右对齐,按79列宽排列所有文本
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' 
###这个语句好像很麻烦,不过看懂了还挺有意思.:)
###首先出现了几个新东东1.":"  2."&". 3. "-e " 4."t",解释一下
###1.":"  Label for b and t commands.(给b和t命令加注标签)
###2."&" 表示重复整个匹配的规则表达式.
###3. "-e" add the script to the commands to be executed
###   把脚本加到命令里用以执行  
###如果从读入最后一个输入行并且执行最后一个t或者T命令后,一个s///命令成功替换,
###那么流程分支指向label处,如果label被忽略(就是没有成功替换吧,我想),那么流程
###分支指向脚本结束.
###回过头来看,整个sed命令行是一个循环执行的语句,每一行都要替换(78-当前行的字
###符数)次,所以如果整个文件比较大,或者一行字符数比较少,做这个动作就有点吃力了.
###不信你试试吧,呵呵.

#使所有文本居于79列宽的格式中央。在第一种方法中,每一行开头处的空格是
#很重要的,最后的空格被附在行尾。第二种方法中,一行开头的空格在中心对
#齐的行中被丢弃,行尾也没有原来结尾处的空格。
sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # method 1
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\(*\)1/\1/' # method 2


#在每一行中用"bar" 替换(找并替换)foo"
sed 's/foo/bar/' # replaces only 1st instance in a line
                 # 在一行中,仅在第一次出现时替换
sed 's/foo/bar/4' # replaces only 4th instance in a line
                  #在一行中,仅在第四次出现时替换
sed 's/foo/bar/g' # replaces ALL instances in a line
                  #在一行中替换所有出现的值
###就不直接翻译了,大概意思就是replacement处可以包含&代表匹配的模式空间中
###的部分,特殊的\1-\9可以代表regexp中相应的"子表达式",也就是说前面regexp
###可以分为几个子表达式,而后边 replacement中可以用\1-\9分别代表它们.这样就
###增加了灵活性,便于修改sed命令.
###把regexp中的\去掉后,就变成(.*)foo(*foo),其中(.*)表示零个或者多个字符,
###这样加上后边的\1bar\2就变成了改变倒数第二个foo,而倒数第一个不变

sed 's/\(*\)foo/\1bar/' #只替换最后一个值

#在每一含有"baz"的行中用"bar"替换(查找并替换)foo"
sed '/baz/s/foo/bar/g'
### /baz/用来查找,后边的用来替换

#在每一不含有"baz" 的行中用"bar"替换(找并替换)foo"
sed '/baz/!s/foo/bar/g'

#将"scarlet"或者"ruby"或者"puce"替换成"red"
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' # most seds

#反转文章行的顺序(类似"tac" )
sed '1!G;h;$!d' # method 1
sed -n '1!G;h;$p' # method 2

#反转一行中每个字符的顺序(类似"rev")
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' 
###'/\n/!G'是判断本行是否有换行符,如果没有执行G命令
###'s/\(.\)\(.*\n\)/&\2\1/'命令是在原来行+第二个字符(或者没有)开始到换行符+第一个字符
###//D命令是在模式空间删除第一行,注意执行完成后如果模式空间不为空,继续下一个
###循环执行.
###s/.//命令是删除第一个字符

#把两行合为一行(类似于"paste")
sed '$!N;s/\n/ /'

#如果一行以"\"结束,把下一行加在此行上
sed -e :a -e '/\\$/N; s/\\\n//; ta'

#如果一等号开始某一行,把这一行加到前一行后边,并且用一个空格替换等号
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
## P命令--Print up to the first embedded newline of  the  current 
###pattern  space.打印当前模式空间中第一行。
###D命令--Delete up to the first embedded newline in
### the  pattern  space. Start  next  cycle,  but skip reading from
###the input if there is still data in the pattern space.
###删除当前模式空间中第一行。开始新的循环,但是如果在模式空间中仍然
###有数据,那么跳过读取输入。

#给数字串加逗号,把"1234567"变为"1,234,567"
gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'  # other seds
###(.*[0-9])表示零个或者多个字符(可能包含数字)+一个数字,而
###([0-9]{3})表示三个数字, 然后不停的替换,直到条件不成立,也就是没有
###四个以上连续的数字出现就停止了.

#给带有小数点和负号的数字的数字加上逗号
gsed ':a;s/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g;ta'

#每五行后加一空行
gsed '0~5G' # GNU sed only
sed 'n;n;n;n;G;' # other seds

#打印一个文件的前10行(模仿动作"head")
sed 10q

#打印一个文件的第一行(仿"head -1")
sed q
### q命令的解释Immediately quit the sed  script  without  processing
###any  more input,  except  that  if  auto-print is not disabled the
###current pattern space will be printed.
### 所以上边两个命令都清楚了,执行到第10行退出就打印前10行,执行第一行
###就退出就打印第一行  

#打印一个文件的后10行(仿"tail")
sed -e :a -e '$q;N;11,$D;ba'
###Label b : Branch to label; if label is omitted, branch to end of script.
###命令D 删除模式空间内第一个 newline 字母 \n 前的资料。 
###命令N 把输入的下一行添加到模式空间中。
### b label:分支到脚本中带有标号的地方,如果标号不存就分支到脚本的末尾

#打印一个文件的最后两行(仿"tail -2")
sed '$!N;$!D'
###sed '$!N;$!D' : 对文件倒数第二行以前的行来说,N 将当前行的下一行放到模
###式空间中以后,D 就将模式空间的内容删除了;到倒数第二行的时候,将最后一行
###附加到倒数第二行下面,然后最后一行不执行 D ,所以文件的最后两行都保存下来了。
###不知道是这段话说得有些含糊,还是我理解得有偏差,总觉得D命令解释成
###"将模式空间的内容删除了"有些让人糊涂.
###而我是这样理解的,不知道对不对.首先说D命令是 Delete up to the first
###embedded newline in  the  pattern  space.也就是说D命令是删除模式空间中
###第一个换行符之前的内容,也就是删除第一行.然后D命令的解释还有一句,我认为
###这句很重要: Start  next  cycle,  but skip reading from the input if there
### is still data in the pattern space.开始下一个循环,但是如果模式空间中有 
###数据,则跳过从输入中读取数据.

#打印一个文件的最后一行(仿"tail -1")
sed '$!d' # method 1
sed -n '$p' # method 2

#只打印匹配的一定字符的行(仿"grep")
sed -n '/regexp/p' # method 1
sed '/regexp/!d' # method 2

#只打印于一定字符不匹配的行(效"grep -v")
sed -n '/regexp/!p' # method 1, corresponds to above
sed '/regexp/d' # method 2, simpler syntax

#打印包含"regexp"那一行的上一行,但是不打印包含"regexp"的行.
sed -n '/regexp/{g;1!p;};h'
###在命令执行到包含"regexp"那一行的上一行时,模式空间中这行的内容被
###拷贝到保留空间中.执行到包含"regexp"那一行时就打印它了.

#打印在"regexp"之后紧跟那一行,但是除去包含"regexp"的行.
sed -n '/regexp/{n;p;}'

#在"regexp"前后打印一行上下文,使其行号指示"regexp"在哪里出现(
#grep -A1 -B1相似)
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

#查找"AAA"和"BBB"和"CCC".(任意顺序)
sed '/AAA/!d; /BBB/!d; /CCC/!d'

# 查找"AAA"和"BBB"和"CCC".(一定顺序)
sed '/AAA.*BBB.*CCC/!d'

#查找"AAA"或"BBB"或"CCC".(任意顺序)
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # most seds
gsed '/AAA\|BBB\|CCC/!d' # GNU sed only

#如果某段包含"AAA",则打印这一段。(空行用来分隔段落)
#HHsed v1.5必须在'x;'之后插入一个'G;'
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

#如果某段包含"AAA"和"BBB"和"CCC",则打印这一段
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

# 如果某段包含"AAA"或"BBB"或"CCC",则打印这一段
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # GNU sed only

#仅打印长于65个字符的行
sed -n '/^.\{65\}/p'

#仅打印少于65个字符的行
sed -n '/^.\{65\}/!p' # method 1, corresponds to above
sed '/^.\{65\}/d' # method 2, simpler syntax

#打印从字符"regexp"开始到文件结束的部分
sed -n '/regexp/,$p'
###还没啥,注意","的作用是选择行的范围,从包含regexp的行到最后一行

#根据行号来打印文件的一部分(-12行,包括在内)
sed -n '8,12p' # method 1
sed '8,12!d' # method 2

#打印第52行
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3, efficient on large files
###仅注意第三种方法效率比较高就行了

#从第三行开始,每7行打印一行
gsed -n '3~7p' # GNU sed only
sed -n '3,${p;n;n;n;n;n;n;}' # other seds

#打印文件中指定字符之间的部分(含字符在内)
sed -n '/Iowa/,/Montana/p' # case sensitive

#打印除指定字符之间部分之外的全文
sed '/Iowa/,/Montana/d'

#删除文件中重复的连续的行(似于"uniq"命令)
#重复行中第一行保留,其他删除
sed '$!N; /^\(.*\)\n\1$/!P; D'  
###如果不是最后一行,就把下一行附加在模式空间,然后进行查找操作
###"^"和"$"中间的内容如果有重复就匹配成功.如果匹配不成功就用P打印
###第一行. 然后删除第一行.

#删除文件中重复的,但不连续的行。注意不要溢出保留空间的缓冲器的大小,
#否则使用GNU sed.
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'  

#删除一个文件中前10行
sed '1,10d'

#删除一个文件中最后1行
sed '$d'
###与上边一个都是查找删除

#删除一个文件中最后2行
sed 'N;$!P;$!D;$d'

#删除一个文件中后10行
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # method 2

# 每8行删除1行
gsed '0~8d' # GNU sed only
sed 'n;n;n;n;n;n;n;d;' # other seds

#删除文件所有空白行(似于"grep '.' ")
sed '/^$/d' # method 1
sed '/./!d' # method 2

#删除文件中除一行空白行之外的所有连续空白行,也同时删除所有从头到尾的所
#有空白行(似于"cat -s")
sed '/./,/^$/!d' # method 1, allows 0 blanks at top, 1 at EOF
                 #方法1不允许文件顶部有空行,文件尾部可以
sed '/^$/N;/\n$/D' # method 2, allows 1 blank at top, 0 at EOF
                 #方法2不允许文件尾部有空行,文件顶部可以
###两个先选择,后删除命令.不多说了.

#删除文件中连续空行中除前两行空白行之外的所有空白行
sed '/^$/N;/\n$/N;//D'
###跟上边的命令相似,多了一步而已.               

#删除文件开头部分中的所有空白行
sed '/./,$!d'
###从有字符开始的行直到最后一行保留,其他删除.

#删除文件结尾部分中的所有空白行
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # works on all seds
sed -e :a -e '/^\n*$/N;/\n$/ba' # ditto, except for gsed 3.02*

#删除每个段落中最后1行
sed -n '/^$/{p;h;};/./{x;/./p;}'

# 从man page页里删除所有overstrikes(字符,backspace).如果使用unix系统v
#或者bash shell,echo命令可能需要-e参数.
sed "s/.`echo \\\b`//g" # double quotes required for Unix environment
                        #unix环境下需要双引号
sed 's/.^H//g' # in bash/tcsh, press Ctrl-V and then Ctrl-H
               #在bash/tcsh中,按Ctrl-V然后按Ctrl-H
sed 's/.\x08//g' # hex expression for sed v1.5
                 #sed v1.5中的hex表达式

# 获得新闻组/e-mail信息的标题部分
sed '/^$/q' # deletes everything after first blank line

#获得新闻组/e-mail信息的主体部分
sed '1,/^$/d' # deletes everything up to first blank line

#获得题目的标题,但是删去开始的"Subject: "部分
sed '/^Subject: */!d; s///;q'

#获得返回的地址标题()
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

#正确解析地址。把email地址从一行中单独提出来并返回地址头()
sed 's/ *(*)/; s/>.*//; s/.*[:<] *//'

#给每行增加的尖括号和空格()信息被引用)
#sed 's/^/> /'

#删除每行的尖括号和空格()信息不被引用)
sed 's/^> //'

#删去大部分HTML标签(供多行标签))
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'

#抽取多部分未编码的二进制字节,删除无关的头信息,使得只保留未编码的部分.
#文件传送给sed必须保持正确的顺序。第一版本可以用于命令行的执行,第二版本
#可以制作成一个可执行的unix shell脚本
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1
sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2

#独立的压缩每个txt文件,删除原文件并且根绝原文本文件设置每个zip文件名。
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^\(*\).TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat
分享到:
评论

相关推荐

    Linux中sed如何处理文本

    由于sed处理的是经过前一个命令修改后的行,所以最终的结果是将“pig”替换成了“horse”。 sed命令可以指定0个、1个或2个地址。如果没有指定地址,那么命令将应用于每一行。如果指定了一个地址,那么命令应用于...

    5.4: 正则表达式 、 sed基本用法 、 sed文本块处理.docx

    sed 命令可以用来处理多行文本,例如: ``` [root@svr5 ~]# sed -n '/^rpc/,/^$/p' /etc/passwd ``` 这将输出 /etc/passwd 文件中的 rpc 用户记录。 本文档详细介绍了正则表达式的基本用法和sed命令的应用,旨在...

    sed Win32文本处理工具

    强大的命令行形式文本处理工具sed(GNU stream editor),此工具为win32移植版本,用于windows环境下,结合正则表达式可以批量完成大量文本文件的处理,相关学习文档本社区有大量的资源

    sed 使用手册linux unix 下常用的文本处理工具。用来处理格式化文本

    根据提供的文件信息,我们可以归纳出一系列关于sed与awk在Linux/Unix系统下的使用方法与技巧。下面将详细解析这些知识点: ### sed 常用命令与应用 #### 1. 删除空行 ``` sed '/^$/d filename' ``` 这条命令会删除...

    Linux shell 用sed命令在文本的行尾或行首添加字符

    在使用 sed 命令处理文本时,需要注意 Windows 和 Linux 的换行符号问题。Windows 使用的是 `\r\n` 换行符号,而 Linux 使用的是 `\n` 换行符号。如果从 Windows 导出文件到 Linux 中处理,可能会出现问题,因为 ...

    sedsed工具

    `sedsed`工具在`sed`基础上增强了删除操作的便利性,简化了文本处理流程,尤其适合于需要快速处理文本的场景。熟悉并掌握`sedsed`的用法,能提升Linux环境下的文本处理效率,是Linux系统管理员和开发者的重要工具之...

    sed命令 处理编辑文本文件

    Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法格式:sed [参数] 常用参数: -e或–...

    linux 系统 sed 命令使用方法

    `sed`是Stream Editor的缩写,在Linux系统中是一种非常强大的文本处理工具。它能够按照脚本指令读取输入文件(标准输入或文本文件),对其进行模式匹配、替换、删除等操作,并将处理后的结果输出到标准输出或其他...

    sed使用方法详解sed使用方法详解

    sed(stream editor)是一种强大的文本处理工具,在Linux和Unix环境中被广泛用于非交互式的文本编辑任务。它能够读取输入流(通常来自文件或标准输入),执行指定的操作,并将结果输出到标准输出或其他文件中。sed...

    sed-4.2.1.rar包括sed-4.2.1-setup.exe、sed-4.2.1-dep.zip、sed-4.2.1-bin.zip

    **sed工具介绍** `sed` 是“流编辑器”...总的来说,`sed`是一款功能强大的文本处理工具,无论是简单的文本替换还是复杂的文本转换,它都能胜任。了解并熟练使用`sed`,对于提升日常的文本处理效率非常有帮助。

    Linux文本处理命令:awk、sed、grep

    Sed是一个流编辑器(Stream Editor),它一次处理文本文件的一行内容,对模式空间(pattern space)中的文本执行一系列编辑操作。Sed通常用于快速编辑文件,尤其是在处理大量数据时,它不会直接修改原文件,而是将...

    sed-4.2.1-setup

    总的来说,sed是一个极其有用的文本处理工具,尤其对于程序员和系统管理员来说,它能够在命令行环境中高效地处理文本文件,简化工作流程。而sed-4.2.1-setup.exe的提供,方便了Windows用户在本地系统中安装和使用这...

    sed中文指南 详细介绍了SED的用法与实例

    SED的主要优势在于它能够高效地处理重复性的文本编辑任务,如字符串替换、行的删除和插入等,特别适合于批量处理大型文本文件。 #### 2. SED的应用场景 在日常的文本处理工作中,SED常常被用来执行以下几种常见的...

    GNU sed manual说明书

    sed内部有保持缓冲区(hold buffer)和模式空间(pattern space),它们用于在处理文本流时暂存文本。通过D、G、H、N和P等命令可以实现多行技术,处理跨越多行的文本。 在流控制方面,GNU sed提供了分支命令,允许...

    Linux教程-linux文本处理-sed.docx

    Linux 教程 - Linux 文本处理 - sed sed 是一个强大的流编辑器,主要用于文本处理。它可以从文件或管道中读取文本,并对其进行处理,然后输出处理后的结果。sed 的工作原理是从文件或管道中读取一行,处理一行,...

    sed手册完整版

    sed(Stream Editor)是一种非交互式的文本编辑工具,适用于自动化处理文本编辑任务。当你面临以下几种情况时,使用sed会非常有效: - **处理大文件:** 对于过大的文件,直接使用交互式编辑器可能会很耗时或导致...

    Sed与awk第二版(中文高清版)

    它不仅系统地介绍了sed和awk的使用方法,还通过实例演示了如何编写有效的脚本来处理文本数据。对于那些希望提高自己在Linux环境中处理文本和数据能力的用户来说,这本书是一个极佳的学习资源。 Sed的常用功能包括但...

    sed.exe win x32 x64

    标题中的"sed.exe win x32 x64"指的是在Windows操作系统中,为32位(x32)和64位(x64)系统提供的sed命令行工具。sed(流编辑器Stream Editor)是一个...正确安装并掌握sed的使用,能极大地提高你在处理文本任务时的效率。

Global site tag (gtag.js) - Google Analytics