欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Sed 用法

程序员文章站 2022-05-11 16:28:03
...
sed 编辑器 Linux 系统管理员工具包有用资产之

Linux 操作系统大好处带有各种各样实用工具存此之多同实用工具几乎能知道并了解所有些工具简化关键情况下操作实用 工具 sed任何管理员工具包强大工具之并且证明自己关键情况下非常有价值

sed 实用工具编辑器与其大多数编辑器同除了面向屏幕之外还非交互式意味着您必须要对数据执行命令插入命令行或要处 理脚本当显示时请忘记您使用 Microsoft Word 或其大多数编辑器时拥有交互式编辑文件功能sed 文件(或文件集)非交互式、并且加询问地接收系列命令并执行们因而流经文本同水流经溪流样因而 sed 恰当地代表了流编辑器用来所有出现 "Mr. Smyth" 修改 "Mr. Smith"或 "tiger cub" 修改 "wolf cub"流编辑器非常适合于执行重复编辑种重复编辑由人工完成花费大量时间其参数能和次性使用简单操作所需参数样有限 或者和具有成千上万行要进行编辑修改脚本文件样复杂sed  Linux 和 UNIX 工具箱有用工具之且使用参数非常少

sed 工作方式

sed 实用工具按顺序逐行文件读入内存执行该行指定所有操作并完成请求修改之该行放回内存其转储至终端完成了行 上所有操作之读取文件下行重复该过程直完成该文件同前面所提默认输出每行内容输出屏幕上里开始涉及 两重要因素—首先输出被重定向另文件保存变化;第二源文件(默认地)保持被修改sed 默认读取整文件并对其每行进行修改过按需要操作限制指定行上

该实用工具语法:

sed [options] '{command}' [filename]

篇文章我们浏览常用命令和选项并演示们何工作及们适于何处使用

替换命令

sed 实用工具及其任何类似编辑器常用命令之用值替换另值用来实现目操作命令部分语法:

's/{old value}/{new value}/'

因而下面演示了何非常简单地 "tiger" 修改 "wolf":

$ echo The tiger cubs will meet on Tuesday after school | sed
's/tiger/wolf/'
The wolf cubs will meet on Tuesday after school
$

注意输入源自之前命令输出则需要指定文件名—同样原则也适用于 awk、sort 和其大多数 LinuxUNIX 命令行实用工具程序

多次修改

需要对同文件或行作多次修改有三种方法来实现第种使用 "-e" 选项通知程序使用了多条编辑命令例:

$ echo The tiger cubs will meet on Tuesday after school | sed -e '
s/tiger/wolf/' -e 's/after/before/'
The wolf cubs will meet on Tuesday before school
$

实现非常复杂方法因此 "-e" 选项常被大范围使用更好方法用分号来分隔命令:

$ echo The tiger cubs will meet on Tuesday after school | sed '
s/tiger/wolf/; s/after/before/'
The wolf cubs will meet on Tuesday before school
$

注 意分号必须紧跟斜线之下字符两者之间有空格操作能成功完成并返回条错误消息两种方法都好许多管理员更喜欢另种 方法要注意关键问题两撇号 (' ') 之间全部内容都被解释 sed 命令直您输入了第二撇号读入些命令 shell 程序才会认您完成了输入意味着多行上输入命令—同时 Linux 提示符从 PS1 变延续提示符(通常 ">")—直输入了第二撇号旦输入了第二撇号并且按下了 Enter 键则处理进行并产生相同结下所示:

$ echo The tiger cubs will meet on Tuesday after school | sed '
> s/tiger/wolf/
> s/after/before/'
The wolf cubs will meet on Tuesday before school
$

全局修改

让我们开始次看似简单编辑假定要修改消息出现了多次要修改项目默认方式下结能和预期有所同下所示:

$ echo The tiger cubs will meet this Tuesday at the same time
as the meeting last Tuesday | sed 's/Tuesday/Thursday/'
The tiger cubs will meet this Thursday at the same time
as the meeting last Tuesday
$

与 出现每 "Tuesday" 修改 "Thursday" 相反sed 编辑器找要修改项目并作了修改之继续处理下行而读整行sed 命令功能大体上类似于替换命令意味着们都处理每行出现第选定序列了替换出现每项目同行出现多要替换项目情况下 您必须指定全局进行该操作:

$ echo The tiger cubs will meet this Tuesday at the same time
as the meeting last Tuesday | sed 's/Tuesday/Thursday/g'
The tiger cubs will meet this Thursday at the same time
as the meeting last Thursday
$

请记住管您要查找序列否仅包含字符或词组种对全局化要求都必需

sed 还用来修改记录字段分隔符例下命令把所有 tab 修改空格:

sed 's// /g'

其 第组斜线之间项目 tab而第二组斜线之间项目空格作条通用规则sed 用来任意打印字符修改任意其打印字符您想打印字符修改打印字符—例铃铛修改单词 "bell"—sed 适于完成项工作工具( tr )

有时您想修改文件出现所有指定项目有时您只想满足某些条件时才作修改—例与其些数据匹配之才作修改了说明点请考虑下文本文件:

$ cat sample_one
one 1
two 1
three 1
one 1
two 1
two 1
three 1
$

假定希望用 "2" 来替换 "1"仅单词 "two" 之才作替换而每行所有位置通过指定给出替换命令之前必须存次匹配实现点:

$ sed '/two/ s/1/2/' sample_one
one 1
two 2
three 1
one 1
two 2
two 2
three 1
$

现使其更加准确:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

请 再次记住唯改变了显示您查看源文件您发现始终保持变您必须输出保存至另文件实现永久保存值得重复对源文件作修 改实际祸有福—让您能够对文件进行试验而会造成任何实际损害直让正确命令您预期和希望方式进行工作

下命令修改输出保存至新文件:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/' sample_one > sample_two

该输出文件所有修改合并其并且些修改通常屏幕上显示现用 head、cat 或任意其类似实用工具来进行查看

脚本文件

sed 工具允许您创建脚本文件其包含从该文件而命令行进行处理命令并且 sed 工具通过 "-f" 选项来引用通过创建脚本文件您能够次又次地重复运行相同操作并指定比每次希望从命令行进行处理操作详细得多操作

考虑下脚本文件:

$ cat sedlist
/two/ s/1/2/
/three/ s/1/3/
$

现数据文件上使用脚本文件获得和我们之前看相同结:

$ sed -f sedlist sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

注意当调用 "-f" 选项时源文件内或命令行使用撇号脚本文件也称源文件对于想重复多次操作和从命令行运行能出错复杂命令有价值编辑源文件并修改字符比命令行重新输入条多行项目要容易得多

限制行

编辑器默认查看输入流编辑器每行且默认输入流编辑器每行上进行编辑通过发出命令之前指定约束条件来进行修改例只此示例文件输出第 5 和第 6 行用 "2" 来替换 "1"命令:

$ sed '5,6 s/1/2/' sample_one
one 1
two 1
three 1
one 1
two 2
two 2
three 1
$

种情况下因要修改行专门指定所需要替换命令因此您灵活地根据匹配准则(行号或种匹配模式)来选择要修改哪些行(从根本上限制修改)

禁止显示

sed 默认来自源文件每行显示屏幕上(或重定向文件)而无论该行否受编辑操作影响"-n" 参数覆盖了操作"-n" 覆盖了所有显示并且显示任何行而无论们否被编辑操作修改例:

$ sed -n -f sedlist sample_one
$

$ sed -n -f sedlist sample_one > sample_two
$ cat sample_two
$

第示例屏幕上显示任何东西第二示例修改任何东西因此任何东西写新文件—空否定了编辑全部目 有用有用仅因 "-n" 选项能够被条显示命令 (-p) 覆盖了说明点假定现像下面样对脚本文件进行了修改:

$ cat sedlist
/two/ s/1/2/p
/three/ s/1/3/p
$

下面运行结:

$ sed -n -f sedlist sample_one
two 2
three 3
two 2
two 2
three 3
$

保持变行全部被显示只有受编辑操作影响行被显示了种方式下仅取出些行进行修改把们放单独文件:

$ sed -n -f sedlist sample_one > sample_two
$

$ cat sample_two
two 2
three 3
two 2
two 2
three 3
$

利用另种方法只显示定数量行例只显示 2-6 行同时做其编辑修改:

$ sed -n '2,6p' sample_one
two 1
three 1
one 1
two 1
two 1
$

其所有行被忽略只有 2-6 行作输出显示项出色功能其任何工具都能容易地实现Head 显示文件顶部而 tail 显示文件底部 sed 允许从任意位置取出想要任意内容

删除行

用值替换另值远非流编辑器执行唯功能还具有许多潜功能我看来第二种常用功能删除删除与替换工作方式相同只删除指定行(您想要删除单词而行要考虑删除而应考虑用空内容来替换—s/cat//)

该命令语法:

'{what to find} d'

从 sample_one 文件删除包含 "two" 所有行:

$ sed '/two/ d' sample_one
one 1
three 1
one 1
three 1
$

从显示屏删除前三行而管们内容:

$ sed '1,3 d' sample_one
one 1
two 1
two 1
three 1
$

只显示剩下行前三行显示屏出现对于流编辑器般当们涉及全局表达式时特别应用于删除操作时有几点要记住:

上三角号 (^) 表示行开始因此 "two" 该行头三字符则

sed '/^two/ d' sample_one

只删除该行
美元符号 ($) 代表文件结尾或行结尾因此 "two" 该行三字符则

sed '/two$/ d' sample_one

只删除该行

两者结合起结:

sed '/^$/ d' {filename}

删除文件所有空白行例下命令 "1" 替换 "2"及 "1" 替换 "3"并删除文件所有尾随空行:

$ sed '/two/ s/1/2/; /three/ s/1/3/; /^$/ d' sample_one
one 1
two 1
three 1
one 1
two 2
two 2
three 1
$

其通常用途删除标题下命令删除文件所有行从第行直第空行:

sed '1,/^$/ d' {filename}

添加和插入文本

结合使用 sed 和 "a" 选项文本添加文件末尾实现方法下:

$ sed '$a
> This is where we stop
> the test' sample_one
one 1
two 1
three 1
one 1
two 1
two 1
three 1
This is where we stop
the test
$

该命令美元符号 ($) 表示文本被添加文件末尾反斜线 () 必需表示插入回车符们被遗漏了则导致错误显示该命令错乱;任何要输入回车地方您必须使用反斜线

要些行添加第 4 和第 5 位置而末尾则命令变:

$ sed '3a
> This is where we stop
> the test' sample_one
one 1
two 1
three 1
This is where we stop
the test
one 1
two 1
two 1
three 1
$

文本添加第 3 行之和几乎所有编辑器样您选择插入而添加(您希望样)两者区别添加跟指定行之而插入从指定行开始当用插入来代替添加时只需用 "i" 来代替 "a"下所示:

$ sed '3i
> This is where we stop
> the test' sample_one
one 1
two 1
This is where we stop
the test
three 1
one 1
two 1
two 1
three 1
$

新文本出现输出间位置而处理通常指定操作执行继续进行

读写文件

重定向输出功能已经演示过了需要指出编辑命令运行期间同步地读入和写出文件例执行替换并 1-3 行写名称 sample_three 文件:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> 1,3 w sample_three' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

$ cat sample_three
one 1
two 2
three 3
$

由于 w (write) 命令指定了 "1,3"所只有指定行被写了新文件无论被写哪些行所有行都默认输出显示

修改命令

除了替换项目之外还行从值修改另值要记住替换对字符逐进行而修改功能与删除类似影响整行:

$ sed '/two/ c
> We are no longer using two' sample_one
one 1
We are no longer using two
three 1
one 1
We are no longer using two
We are no longer using two
three 1
$

修 改命令与替换工作方式相似范围上要更大些—项目完全替换另项目而无论字符内容或上下文夸张点讲当使用替换时只有字符 "1" 被字符 "2" 替换而当使用修改时原来整行被修改两种情况下要寻找匹配条件都仅 "two"

修改全部……

对于大多数 sed 命令详细说明各种功能要进行何种修改利用感叹号除指定位置之外任何地方执行修改—与默认操作完全相反

例要删除包含单词 "two" 所有行操作:

$ sed '/two/ d' sample_one
one 1
three 1
one 1
three 1
$

而要删除除包含单词 "two" 行之外所有行则语法变:

$ sed '/two/ !d' sample_one
two 1
two 1
two 1
$

您有文件包含系列项目并且想对文件每项目执行操作首先对些项目进行次智能扫描并考虑要做重要了使事情变得更简单您 sed 与任意迭代例程(for、while、until)结合来实现目

比说假定您有名 "animals" 文件其包含下项目:

pig
horse
elephant
cow
dog
cat

您希望运行下例程:

#mcd.ksh
for I in $*
do
echo Old McDonald had a $I
echo E-I, E-I-O
done

结 每行都显示 "Old McDonald has a" 末尾虽对于些项目大部分正确对于 "elephant" 项目有语法错误因结应当 "an elephant" 而 "a elephant"利用 sed您来自 shell 文件输出检查种语法错误并通过首先创建命令文件来即时地更正们:

#sublist
/ a a/ s/ a / an /
/ a e/ s/ a / an /
/a i/ s / a / an /
/a o/ s/ a / an /
/a u/ s/ a / an /

执行下过程:

$ sh mcd.ksh 'cat animals' | sed -f sublist

现 运行了 mcd 脚本之sed 输出搜索单字母 a (空格"a"空格)之紧跟了元音任意位置种位置存把该序列修改空格"an"空格样使问题更正才显示屏幕上 并确保各处编辑人员晚上更容易地入睡结:

Old McDonald had a pig
E-I, E-I-O
Old McDonald had a horse
E-I, E-I-O
Old McDonald had an elephant
E-I, E-I-O
Old McDonald had a cow
E-I, E-I-O
Old McDonald had a dog
E-I, E-I-O
Old McDonald had a cat
E-I, E-I-O

提前退出

sed 默认读取整文件并只达末尾时才停止过您使用退出命令提前停止处理只能指定条退出命令而处理直持续直满足调用退出命令条件

例仅文件前五行上执行替换退出:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> 5q' sample_one
one 1
two 2
three 3
one 1
two 2
$

退出命令之前项目行号(上所示)或者条查找/匹配命令:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> /three/q' sample_one
one 1
two 2
three 3
$

您 还使用退出命令来查看超过定标准数目行并增加比 head 功能更强功能例head 命令允许您指定您想要查看文件前多少行—默认数 10使用从 1  99 任意数字您想查看文件前 110 行您用 head 能实现目用 sed :

sed 110q filename

处理问题

当使用 sed 时要记住重要事项工作方式工作方式:读入行该行上执行已知要执行所有任务继续处理下行每行都受给定每编辑命令影响

您操作顺序没有十分彻底地考虑清楚能会麻烦例假定您需要所有 "two" 项目修改 "three"所有 "three" 修改 "four":

$ sed '
> /two/ s/two/three/
> /three/ s/three/four/' sample_one
one 1
four 1
four 1
one 1
four 1
four 1
four 1
$

初读取 "two" 被修改 "three"满足下次编辑建立准则从而变 "four"终结想要结—现除了 "four" 没有别项目了而本来应该有 "three" 和 "four"

当执行种操作时您必须非常用心地注意指定操作方式并按某种顺序来安排们使得操作之间会互相影响例:

$ sed '
> /three/ s/three/four/
> /two/ s/two/three/' sample_one
one 1
three 1
four 1
one 1
three 1
three 1
four 1
$

非常有效因 "three" 值 "two" 变成 "three" 之前得修改

标签和注释

sed 脚本文件放置标签样旦文件变得庞大更容易地说明正发生事情存各种各样与些标签相关命令们包括:
接下来步骤

访问并收藏 Linux 技术心

阅读 Dale Dougherty 和 Arnold Robbins 著作 sed & awk, 2nd Edition (O'Reilly & Associates 出版社)

: 冒号表示标签名称例:

:HERE

冒号开始标签由 "b" 和 "t" 命令处理

b {label} 充当 "goto" 语句作用处理发送至前面有冒号标签例

b HERE

处理发送给行

:HERE

紧跟 b 之没有指定任何标签则处理转至脚本文件末尾

t {label} 只要自上次输入行或执行次 "t" 命令来进行了替换操作转至该标签和 "b" 样没有给定标签名则处理转至脚本文件末尾

# 符号作行第字符使整行被当作注释处理注释行与标签同能使用 b 或 t 命令来转注释行上



替换文件内容:sed -i "s/10.11.65.68/10.16.19.95/g" memcached_client.xml
相关标签: 脚本 linux