`

sed命令详解

阅读更多


1.sed -n '2'p filename
打印文件的第二行。
2.sed -n '1,3'p filename
打印文件的1到3行
3. sed -n '/Neave/'p filename
打印匹配Neave的行(模糊匹配)
4. sed -n '4,/The/'p filename
在第4行查询模式The
5. sed -n '1,$'p filename
打印整个文件,$表示最后一行。
6. sed -n '/.*ing/'p filename
匹配任意字母,并以ing结尾的单词(点号不能少)
7 sed -n / -e '/music/'= filename
打印匹配行的行号,-e 会打印文件的内容,同时在匹配行的前面标志行号。-n只打印出实际的行号。
8.sed -n -e '/music/'p -e '/music/'= filename
打印匹配的行和行号,行号在内容的下面
9.sed '/company/' a\ "Then suddenly it happend" filename
选择含有company的行,将后面的内容"Then suddenly it happend"加入下一行。注意:它并不改变文件,所有操作在缓冲区,如果要保存输出,重定向到一个文件。
10. sed '/company/' i\ "Then suddenly it happend" filename
同9,只是在匹配的行前插入
11.sed '/company/' c\ "Then suddenly it happend" filename
用"Then suddenly it happend"替换匹配company的行的内容。
12.sed '1'd ( '1,3'd '$'d '/Neave/'d) filename
删除第一行(1到3行,最后一行,匹配Neave的行)
13.[ address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
s (switch)选项通知sed这是一个替换操作,并查询pattern-to-find,成功后用replacement-pattern替换它。
替换选项如下:
g (global)缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p (print) 缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。-n选项不打印输出结果。
w (write) 文件名使用此选项将输出定向到一个文件。(注意只将匹配替换的行写入文件,而不是整个内容)
14.sed s'/nurse/"hello "&/' filename
将'hello '增加到'nurse' 的前面。
15. sed '/company/r append.txt' filename
在匹配company的行的下一行开始加入文件append.txt的内容。
16. sed '/company/'q filename
首次匹配company后就退出sed程序

之所以看 sed 命令,是因为我遇到了这个一个问题。
网上有很多教程,他们发表了很多程序代码,但是作者为了解释方便,都对程序作了行号编码,就像下面这样:

代码 ::

1:#!/bin/bash
2:#rename file extesions
3:#
4:# rfe old_extensions new_extension

假设这个文件名是 tmp ,那么我们可以使用下面的命令来去掉这个行号和冒号 ( )

代码 ::


sed -e s'/^[0-9]\{1,\}://g' tmp

不过上面的命令的命令有一个缺点,那就是如果这个行号不是数字开头,而是有空格的话,那就需要修改匹配规则,规则应该修改为匹配第一个非空白字符是数字开始,后面接一个冒号的配对。命令如下:

代码 ::

sed -e s'/^[^0-9a-zA-Z]*[0-9]\{1,\}://g' tmp

这令我很兴奋,于是想看看 sed 到底有多厉害,看了以后,明白的是不是 sed 有多厉害,就像 awk 一样,他们只是把正则表达式用到了极致。

Redhat6.0 为测试环境
事实上在 solaris 下的 sed 命令要比 linux 强,但因为没有测试
环境,我这里只给在 linux 下经过测试的用法。
命令行参数简介
首先假设我们有这样一个文本文件 sedtest.txt
输出指定范围的行 p
在每一行前面增加一个制表符 (^I)
在每一行后面增加 --end
显示指定模式匹配行的行号 [/pattern/]=
在匹配行后面增加文本 [/pattern/]a\ 或者 [address]a\
删除匹配行 [/pattern/]d 或者 [address1][,address2]d
替换匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
在匹配行前面插入文本 [/pattern/]i\ 或者 [address]i\
替换匹配串 ( 注意不再是匹配行 ) [addr1][,addr2]s/old/new/g
限定范围后的模式匹配
指定替换每一行中匹配的第几次出现
& 代表最后匹配
利用 sed 修改 PATH 环境变量
测试并提高 sed 命令运行效率
指定输出文件 [address1][,address2]w outputfile
指定输入文件 [address]r inputfile
替换相应字符 [address1][,address2]y/old/new/
! 号的使用
\c 正则表达式 c 的使用
sed 命令中正则表达式的复杂性
转换 man 手册成普通文本格式 ( )
sed man 手册 ( 用的就是上面的方法 )
命令行参数简介

sed
-e script
指定 sed 编辑命令
-f scriptfile
指定的文件中是 sed 编辑命令
-n
寂静模式,抑制来自 sed 命令执行过程中的冗余输出信息,比如只
显示那些被改变的行。
不明白?不要紧,把这些肮脏丢到一边,跟我往下走,不过下面的介绍里
不包括正则表达式的解释,如果你不明白,可能有点麻烦。
首先假设我们有这样一个文本文件 sedtest.txt
cat > sedtest.txt
Sed is a stream editor
----------------------
A stream editor is used to perform basic text transformations on an input stream
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
输出指定范围的行 p other types of editors.
sed -e "1,4p" -n sedtest.txt
sed -e "/form/p" -n sedtest.txt
sed -e "1,/form/p" -n sedtest.txt
在每一行前面增加一个制表符 (^I)
sed "s/^/^I/g" sedtest.txt
注意 ^I 的输入方法是 ctrl-v ctrl-i
单个 ^ 表示行首
在每一行后面增加 --end
sed "s/$/--end/g" sedtest.txt
单个 $ 表示行尾
显示指定模式匹配行的行号 [/pattern/]=
sed -e '/is/=' sedtest.txt
1
Sed is a stream editor
----------------------
3
A stream editor is used to perform basic text transformations on an input stream
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
7
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
9
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
-
意思是分析 sedtest.txt ,显示那些包含 is 串的匹配行的行号,注意 11 行中出现了 is 字符串
这个输出是面向 stdout 的,如果不做重定向处理,则不影响原来的 sedtest.txt
在匹配行后面增加文本 [/pattern/]a\ 或者 [address]a\
^D
sed -f sedadd.script sedtest.txt
Sed is a stream editor
A stream editor is used to perform basic text transformations on an input stream
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
-
[scz@ /home/scz/src]> sed -e "a\\
+++++++++
---------------------------------------------
找到包含 from 字符串的行,在该行的下一行增加 +++++++++
这个输出是面向 stdout 的,如果不做重定向处理,则不影响原来的 sedtest.txt
很多人想在命令行上直接完成这个操作而不是多一个 sedadd.script ,不幸的是,这需要用 续行符 \
[scz@ /home/scz/src]> sed -e "/from/a\\
+++++++++" sedtest.txt
[scz@ /home/scz/src]> sed -e "a\\
+++++++++" sedtest.txt
上面这条命令将在所有行后增加一个新行 +++++++++
[scz@ /home/scz/src]> sed -e "1 a\\
+++++++++" sedtest.txt
把下面这两行 copy/paste 到一个 shell 命令行上,效果一样
+++++++++" sedtest.txt
[address]a\
只接受一个地址指定
对于 a 命令,不支持单引号,只能用双引号,而对于 d 命令等其他命令,同时支持
删除匹配行 [/pattern/]d 或者 [address1][,address2]d
sed -e '/---------------------------------------------/d' sedtest.txt
Sed is a stream editor
A stream editor is used to perform basic text transformations on an input stream
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
sed works by making only one pass over the input(s), and is consequently more
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
sed -e '6,10d' sedtest.txt
删除 6-10 行的内容,包括 6 10
sed -e "2d" sedtest.txt
删除第 2 行的内容
sed "1,/^$/d" sedtest.txt
删除从第一行到第一个空行之间的所有内容
注意这个命令很容易带来意外的结果,当 sedtest.txt 中从第一行开始并没有空行,则 sed 除所有行
sed "1,/from/d" sedtest.txt
删除从第一行到第一个包含 from 字符串的行之间的所有内容,包括第一个包含 from 字符串的行。
替换匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
sed -e "/is/c\\
**********" sedtest.txt
寻找所有包含 is 字符串的匹配行,替换成 **********
**********
----------------------
**********
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
**********
-----------------------------------------------------------------------------
**********
--------------------------------------------------------------------------------
-
sed -e "1,11c\\
**********" sedtest.txt----------------------
1-12 行内搜索所有 from 字符串,分别替换成 **** 字符串
限定范围后的模式匹配
sed "/But/s/is/are/g" sedtest.txt
对那些包含 But 字符串的行,把 is 替换成 are
sed "/is/s/t/T/" sedtest.txt
对那些包含 is 字符串的行,把每行第一个出现的 t 替换成 T
sed "/While/,/from/p" sedtest.txt -n
输出在这两个模式匹配行之间的所有内容
指定替换每一行中匹配的第几次出现
sed "s/is/are/5" sedtest.txt
把每行的 is 字符串的第 5 次出现替换成 are
& 代表最后匹配
sed "s/^$/(&)/" sedtest.txt
给所有空行增加一对 ()
sed "s/is/(&)/g" sedtest.txt
给所有 is 字符串外增加 ()
sed "s/.*/(&)/" sedtest.txt
给所有行增加一对 ()
sed "/is/s/.*/(&)/" sedtest.txt
给所有包含 is 字符串的行增加一对 ()
利用 sed 修改 PATH 环境变量
先查看 PATH 环境变量
[scz@ /home/scz/src]> echo $PATH
/usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
去掉尾部的 { :/usr/X11R6/bin:. }
[scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\) :\/ usr[/] X11R6\/ bin:[.]$/\1 /"
/usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin
去掉中间的 { :/bin: }
[scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\) :\/ bin:\(.*\) $/\1 \2 /"
/usr/bin:/usr/bin/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
[/]
表示 / 失去特殊意义
\/
同样表示 / 失去意义
\1
表示子匹配的第一次出现
\2
表示子匹配的第二次出现
\(.*\)
表示子匹配
去掉尾部的 : ,然后增加新的路径
PATH=`echo $PATH | sed 's/\(.*\):$/\1/'`:$HOME/src
注意反引号 ` 和单引号 ' 的区别。

测试并提高 sed 命令运行效率
time sed -n "1,12p" webkeeper.db > /dev/null
time sed 12q webkeeper.db > /dev/null
可以看出后者比前者效率高。
[address]q
当碰上指定行时退出 sed 执行
指定输出文件 [address1][,address2]w outputfile
sed "1,10w sed.out" sedtest.txt -n
sedtest.txt 1-10 行的内容写到 sed.out 文件中。
指定输入文件 [address]r inputfile
sed "1r sedappend.txt" sedtest.txt
sedappend.txt 中的内容附加到 sedtest.txt 文件的第一行之后
替换相应字符 [address1][,address2]y/old/new/
sed "y/abcdef/ABCDEF/" sedtest.txt
sedtest.txt 中所有的 abcdef 小写字母替换成 ABCDEF 大写字母。
! 号的使用
sed -e '3,7!d' sedtest.txt
删除 3-7 行之外的所有行
sed -e '1,/from/!d' sedtest.txt
找到包含 from 字符串的行,删除其后的所有行
\c 正则表达式 c 的使用
sed -e "\:from:d" sedtest.txt
等价于 sed -e "/from/d" sedtest.txt
sed 命令中正则表达式的复杂性
cat > sedtest.txt
^\/[}]{.*}[\(]$\)
^D
如何才能把该行替换成
\(]$\)\/[}]{.*}^[
转换 man 手册成普通文本格式 ( )
man sed | col -b > sed.txt
sed -e "s/^H//g" -e "/^$/d" -e "s/^^I/ /g" -e "s/^I/ /g" sed.txt > sedman
txt
删除所有退格键、空行,把行首的制表符替换成 8 个空格,其余制表符替换成一个空格。
sed man 手册 ( 用的就是上面的方法 )
NAME
sed - a Stream EDitor
SYNOPSIS
sed [-n] [-V] [--quiet] [--silent] [--version] [--help]
[-e script] [--expression=script]
[-f script-file] [--file=script-file]
[script-if-no-other-script]
[file...]
DESCRIPTION
Sed is a stream editor. A stream editor is used to per-
form basic text transformations on an input stream (a file
or input from a pipeline). While in some ways similar to
an editor which permits scripted edits (such as ed), sed
works by making only one pass over the input(s), and is
consequently more efficient. But it is sed's ability to
filter text in a pipeline which particularly distinguishes
it from other types of editors.
OPTIONS
Sed may be invoked with the following command-line
options:
-V
--version
Print out the version of sed that is being run and
a copyright notice, then exit.
-h
--help Print a usage message briefly summarizing these
command-line options and the bug-reporting address,
then exit.
-n
--quiet
--silent
By default, sed will print out the pattern space at
the end of each cycle through the script. These
options disable this automatic printing, and sed
will only produce output when explicitly told to
via the p command.
-e script
--expression=script
Add the commands in script to the set of commands
to be run while processing the input.
-f script-file
--file=script-file
Add the commands contained in the file script-file
to the set of commands to be run while processing
the input.
If no -e,-f,--expression, or --file options are given on
the command-line, then the first non-option argument on
the command line is taken to be the script to be executed.
If any command-line parameters remain after processing the
above, these parameters are interpreted as the names of
input files to be processed. A file name of - refers to
the standard input stream. The standard input will pro-
cessed if no file names are specified.
Command Synopsis
This is just a brief synopsis of sed commands to serve as
a reminder to those who already know sed; other documenta-
tion (such as the texinfo document) must be consulted for
fuller descriptions.
Zero-address ``commands''
: label
Label for b and t commands.
#comment
The comment extends until the next newline (or the
end of a -e script fragment).
} The closing bracket of a { } block.
Zero- or One- address commands
= Print the current line number.
a \
text Append text, which has each embedded newline pre-
ceeded by a backslash.
i \
text Insert text, which has each embedded newline pre-
ceeded by a backslash.
q Immediately quit the sed script without processing
any more input, except that if auto-print is not
diabled the current pattern space will be printed.
r filename
Append text read from filename.
Commands which accept address ranges
{ Begin a block of commands (end with a }).
b label
Branch to label; if label is omitted, branch to end
of script.
t label
If a s/// has done a successful substitution since
the last input line was read and since the last t
command, then branch to label; if label is omitted,
branch to end of script.
c \
text Replace the selected lines with text, which has
each embedded newline preceeded by a backslash.
d Delete pattern space. Start next cycle.
D Delete up to the first embedded newline in the pat-
tern space. Start next cycle, but skip reading
from the input if there is still data in the pat-
tern space.
h H Copy/append pattern space to hold space.
g G Copy/append hold space to pattern space.
x Exchange the contents of the hold and pattern
spaces.
l List out the current line in a ``visually unambigu-
ous'' form.
n N Read/append the next line of input into the pattern
space.
p Print the current pattern space.
P Print up to the first embedded newline of the cur-
rent pattern space.
s/regexp/replacement/
Attempt to match regexp against the pattern space.
If successful, replace that portion matched with
replacement. The replacement may contain the spe-
cial character & to refer to that portion of the
pattern space which matched, and the special
escapes \1 through \9 to refer to the corresponding
matching sub-expressions in the regexp.
w filename Write the current pattern space to file-
name.
y/source/dest/
Transliterate the characters in the pattern space
which appear in source to the corresponding charac-
ter in dest.
Addresses
Sed commands can be given with no addresses, in which case
the command will be executed for all input lines; with one
address, in which case the command will only be executed
for input lines which match that address; or with two
addresses, in which case the command will be executed for
all input lines which match the inclusive range of lines
starting from the first address and continuing to the sec-
ond address. Three things to note about address ranges:
the syntax is addr1,addr2 (i.e., the addresses are sepa-
rated by a comma); the line which addr1 matched will
always be accepted, even if addr2 selects an earlier line;
and if addr2 is a regexp, it will not be tested against
the line that addr1 matched.
After the address (or address-range), and before the com-
mand, a ! may be inserted, which specifies that the com-
mand shall only be executed if the address (or address-
range) does not match.
The following address types are supported:
number Match only the specified line number.
first~step
Match every step'th line starting with line first.
For example, ``sed -n 1~2p'' will print all the
odd-numbered lines in the input stream, and the
address 2~5 will match every fifth line, starting
with the second. (This is a GNU extension.)
$ Match the last line.
/regexp/
Match lines matching the regular expression regexp.
\cregexpc
Match lines matching the regular expression regexp.
The c may be any character.
Regular expressions
POSIX.2 BREs should be supported, but they aren't com-
pletely yet. The \n sequence in a regular expression
matches the newline character. There are also some GNU
extensions. [XXX FIXME: more needs to be said. At the
very least, a reference to another document which
describes what is supported should be given.]
Miscellaneous notes
This version of sed supports a \<newline> sequence in all
regular expressions, the replacement part of a substitute
(s) command, and in the source and dest parts of a
transliterate (y) command. The \ is stripped, and the
newline is kept.
SEE ALSO
awk(1), ed(1), expr(1), emacs(1), perl(1), tr(1), vi(1),
regex(5) [well, one ought to be written... XXX], sed.info,
any of various books on sed, the sed FAQ
(http://www.wollery.demon.co.uk/sedtut10.txt,
http://www.ptug.org/sed/sedfaq.htm).
BUGS
E-mail bug reports to bug-gnu-utils@gnu.org. Be sure to
include the word ``sed'' somewhere in the ``Subject:''
field.

 

分享到:
评论

相关推荐

    LINUX_sed命令详解

    **Linux中的sed命令详解** `sed`(流编辑器,Stream Editor)是Linux系统中一个强大的文本处理工具,常用于处理文件或从输入流中过滤数据。它可以在不改变原文件的情况下,对文本进行查找、替换、删除等操作。下面...

    linux sed命令详解

    ### Linux Sed 命令详解 #### 概述 `sed`,全称为“stream editor”,是一种功能强大的文本处理工具,常用于Linux和类Unix系统中。它主要用于文本的过滤和转换工作,能够以流的形式读取并处理文本数据。在处理过程...

    AWK命令详解 sed命令详解

    ### SED 命令详解 **SED** (Stream Editor) 是另一个在 Unix 和类 Unix 系统中广泛使用的文本处理工具,主要用于过滤和转换文本。 #### SED 的基本概念 1. **地址**: 定义命令作用于文本中的哪些行。 2. **命令**...

    sed命令详解.docx

    **sed命令详解** **1. sed命令的基本概念** sed(stream editor)是一个强大的文本处理工具,主要用于对文本文件进行非交互式的编辑操作。它的工作方式是逐行读取输入文件,将当前处理的行存储在临时缓冲区(模式...

    sed命令详解 快速入门

    ### sed命令详解与快速入门 #### 一、sed简介 `sed`,全称为 **Stream Editor**,是一种功能强大的文本处理工具,广泛应用于Linux和Unix系统中。它主要用于执行基本的文本转换工作,在处理文本文件时非常高效。`...

    linux sed命令详解.docx

    "Linux Sed 命令详解" sed 命令是 Linux 中的一种在线编辑器,它可以处理文本文件,并提供了许多功能强大的编辑功能。sed 命令一次处理一行内容,将当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern ...

    linux-Sed命令详解.zip

    在“linux-Sed命令详解”文档中,我们将深入探讨Sed命令的基本用法和高级技巧。 首先,Sed工作基于数据流的概念,它可以读取标准输入或者指定文件的内容,按照指定的命令对每一行进行处理,然后将结果输出到标准...

    sed命令详解及示例例

    sed命令详解及示例

    Linux_Sed命令详解

    Linux Sed 命令详解 Sed 命令是一种在线编辑器,经常用于 shell 脚本中,对大家有帮助。它一次处理一行内容,将当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed 命令处理缓冲区中...

    linux sed 命令详解

    Linux中的`sed`(Stream Editor)命令是一种强大的文本处理工具,它能对输入流(标准输入、文件或者管道)进行实时处理。`sed`的工作方式是读取一行文本,对其进行处理,然后输出,接着处理下一行,直到文件末尾。这...

    Linux Shell脚本编程--sed命令详解.zip_shell sed_命令介绍_脚本 shell

    本文将深入讲解`sed`命令的基本概念、功能以及在Shell脚本中的具体应用。 `sed`是一种非交互式的文本处理工具,它可以从标准输入读取数据,对数据进行处理,然后将结果输出到标准输出。`sed`的强大之处在于它可以...

    linux sed命令详解(推荐)

    sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作。sed是按行来处理文本内容的。在shell中,使用sed来批量修改文本内容是非常方便的。 sed命令的选项 sed [选项] [动作] 选项与参数...

    linux grep sed awk命令详解

    #### 二、sed命令详解 **sed**(stream editor)是一个强大的文本编辑器,可以用于执行基础或复杂的文本转换。它的工作方式是非交互式的,通常用于脚本中处理大量文本文件。 - **基本语法**:`sed [选项] '命令' ...

    基本的SED命令有大量的SED命令

    ### 基本的SED命令详解 #### 一、SED命令概述 SED(Stream Editor)是一种强大的文本处理工具,主要用于对文件进行批量编辑操作。它能够执行诸如替换、删除、插入等多种文本处理任务,尤其适合处理结构化数据或...

    一些sed命令

    **sed命令详解** `sed`(Stream Editor,流编辑器)是Linux/Unix环境中的一款文本处理工具,它能在线性文本流中进行模式匹配、替换、删除等操作,无需交互式编辑,使得批量处理文本变得极其高效。在日常的脚本编程...

    linux script 好用的sed命令

    【sed命令详解与应用】 sed(Stream Editor)是一种强大的文本处理工具,用于对输入流(标准输入或指定的文件)进行读取、处理并打印输出。在Linux和Unix环境中,sed广泛用于数据转换、文本替换、删除、添加、插入...

Global site tag (gtag.js) - Google Analytics