快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新蒲京澳门app下载_酒文化网进入



sed 是很有用(但常新蒲京澳门app下载被遗忘)的 UNIX 流编辑器。在以批处置惩罚要领编辑文件或以有效要领创建 shell 脚原先改动现有文件方面,它是十分抱负的对象。本文是 前一篇先容 sed 文章的续篇。

调换!

让我们看一下 sed 最有用的敕令之一,调换敕令。应用该敕令,可以将特定字符串或匹配的规则表达式用另一个字符串调换。下面是该敕令最基础用法的示例:

$ sed -e 's/foo/bar/' myfile.txt

上面的敕令将 myfile.txt 中每行第一次呈现的 'foo'(假如有的话)用字符串 'bar' 调换,然后将该文件内容输出到标准输出。请留意,我说的是 每行第一次呈现,只管这平日不是您想要的。在进行字符串调换时,平日想履行全局调换。也便是说,要调换每行中的 所有呈现,如下所示:

$ sed -e 's/foo/bar/g' myfile.txt

在着末一个斜杠之后附加的 'g' 选项奉告 sed 履行全局调换。

关于 's///' 调换敕令,还有其它几件要懂得的事。首先,它是一个敕令,并且只是一个敕令,在所有上例中都没有指定地址。这意味着,'s///' 还可以与地址一路应用来节制要将敕令利用到哪些行,如下所示:

$ sed -e '1,10s/enchantment/entrapment/g' myfile2.txt

上例将导致用短语 'entrapment' 调换所有呈现的短语 'enchantment',然则只在第一到第十行(包括这两行)上这样做。

$ sed -e '/^$/,/^END/s/hills/mountains/g' myfile3.txt

该例将用 'mountains' 调换 'hills',然则,只从空行开始,到以三个字符 'END' 开始的行停止(包括这两行)的文本块上这样做。

关于 's///' 敕令的另一个妙处是 '/' 分隔符有许多调换选项。假如正在履行字符串调换,并且规则表达式或调换字符串中有许多斜杠,则可以经由过程在 's' 之后指定一个不合的字符来变动分隔符。例如,下例将把所有呈现的 /usr/local 调换成 /usr:

$ sed -e 's:/usr/local:/usr:g' mylist.txt

在该例中,应用冒号作为分隔符。假如必要在规则表达式中指定分隔符字符,可以在它前面加入反斜杠。

规则表达式纷乱

今朝为止,我们只履行了简单的字符串调换。虽然这很方便,然则我们还可以匹配规则表达式。例如,以下 sed 敕令将匹配从 '' 停止、并且在此中包孕随意率性数量字符的短语。下例将删除该短语(用空字符串调换):

$ sed -e 's///g' myfile.html

这是要从文件撤除 HTML 标记的第一个很好的 sed 脚本考试测验,然则因为规则表达式的特有规则,它不会很好地事情。缘故原由何在?当 sed 试图在行中匹配规则表达式时,它要在行中查找 最长的匹配。在我的 前一篇 sed 文章中,这不成问题,由于我们应用的是 'd' 和 'p' 敕令,这些敕令总要删除或打印整行。然则,在应用 's///' 敕令时,确凿有很大年夜不合,由于规则表达式匹配的全部部分将被目标字符串调换,或者,在本例中,被删除。这意味着,上例将把下行:

This is what I meant.

变成:

meant.

我们要的不是这个,而是:

This is what I meant.

幸运的是,有一种简便措施来矫正该问题。我们不输入“'' 字符停止”的规则表达式,而只需输入一个“'' 字符并以 '>' 字符停止”的规则表达式。这将与最短、而不是最长的可能性匹配。新敕令如下:

$ sed -e 's/]*>//g' myfile.html

在上例中,'[^>]' 指定“非 '>'”字符,其后的 '*' 完成该表达式以表示“零或多个非 '>' 字符”。对几个 html 文件测试该敕令,将它们管道输出到 "more",然后仔细查看其结果。

更多字符匹配

'[ ]' 规则表达式语法还有一些附加选项。要指定字符范围,只要字符不在第一个或着末一个位置,就可以应用 '-',如下所示:

'[a-x]*'

这将匹配零或多个整个为 'a'、'b'、'c'...'v'、'w'、'x' 的字符。别的,可以应用 '[:space:]' 字符类来匹配空格。以下是可用字符类的相称完备的列表:

字符类

描述

[:alnum:]

字母数字 [a-z A-Z 0-9]

[:alpha:]

字母 [a-z A-Z]

[:blank:]

空格或制表键

[:cntrl:]

任何节制字符

[:digit:]

数字 [0-9]

[:graph:]

任何可视字符(无空格)

[:lower:]

小写 [a-z]

[:print:]

非节制字符

[:punct:]

标点字符

[:space:]

空格

[:upper:]

大年夜写 [A-Z]

[:xdigit:]

十六进制数字 [0-9 a-f A-F]

尽可能应用字符类是很有利的,由于它们可以更好地适应非英语 locale(包括某些必需的重音字符等等).

高档调换功能

我们已经看到若何履行简单以致有些繁杂的直接调换,然则 sed 还可以做更多的事。实际上可以引用匹配规则表达式的部分或整个,并应用这些部分来构造调换字符串。作为示例,假设您正在回覆一条消息。下例将在每一行前面加上短语 "ralph said: ":

$ sed -e 's/.*/ralph said: &/' origmsg.txt

输出如下:

ralph sa新蒲京澳门app下载id: Hiya Jim, ralph said: ralph said:

I sure like this sed stuff! ralph said:

该例的调换字符串中应用了 '&' 字符,该字符奉告 sed 插入全部匹配的规则表达式。是新蒲京澳门app下载以,可以将与 '.*' 匹配的任何内容(行中的零或多个字符的最大年夜组或整行)插入到调换字符串中的任何位置,以致多次插入。这异常好,但 sed 以致更强大年夜。

那些极好的带反斜杠的圆括号

's///' 敕令以致比 '&' 更好,它容许我们在规则表达式中定义 区域,然后可以在调换字符串中引用这些特定区域。作为示例,假设有一个包孕以下文本的文件:

foo bar oni eeny meeny miny larry curly moe jimmy the weasel

现在假设要编写一个 sed 脚本,该脚本将把 "eeny meeny miny" 调换成 "Victor eeny-meeny Von miny" 等等。要这样做,首先要编写一个由空格分隔并与三个字符串匹配的规则表达式。

'.* .* .*'

现在,将在此中每个感兴趣的区域两边插入带反斜杠的圆括号来定义区域:

'(.*) (.*) (.*)'

除了要定义三个可在调换字符串中引用的逻辑区域以外,该规则表达式的事情道理将与第一个规则表达式相同。下面是终极脚本:

$ sed -e 's/(.*) (.*) (.*)/Victor 1-2 Von 3/' myfile.txt

如您所见,经由过程输入 'x'(此中,x 是从 1 开始的区域号)来引用每个由圆括号定界的区域。输入如下:

Victor foo-bar Von oni Victor eeny-meeny Von miny Victor larry-curly Von moe Victor jimmy-the Von weasel

跟着对 sed 越来越认识,您可以花最小力气来进行相称强大年夜的文本处置惩罚。您可能想若何应用认识的脚本说话来处置惩罚这种问题 -- 能用一行代码随意马虎实现这样的办理规划吗?

组合应用

在开初创建更繁杂的 sed 脚本时,必要有输入多个敕令的能力。有几种措施这样做。首先,可以在敕令之间应用分号。例如,以下敕令系列应用 '=' 敕令和 'p' 敕令,'=' 敕令奉告 sed 打印行号,'p' 敕令明确奉告 sed 打印该行(由于处于 '-n' 模式)。

$ sed -n -e '=;p' myfile.txt

无论什么时刻指定了两个或更多敕令,都按顺序将每个敕令利用到文件的每一行。在上例中,首先将 '=' 敕令利用到第 1 行,然后利用 'p' 敕令。接着,sed 继承处置惩罚第 2 行,并重复该历程。虽然分号很方便,然则在某些场合下,它不能正常事情。另一种调换措施是应用两个 -e 选项来指定两个不合的敕令:

$ sed -n -e '=' -e 'p' myfile.txt

然而,在应用更为繁杂的附加和插入敕令时,以致多个 '-e' 选项也不能帮我们的忙。对付繁杂的多行脚本,最好的措施是将敕令放入一个零丁的文件中。然后,用 -f 选项引用该脚本文件:

$ sed -n -f mycommands.sed myfile.txt

这种措施虽然可能不太方便,但老是管用。

一个地址的多个敕令

无意偶尔,可能要指定利用到一个地址的多个敕令。这在履行许多 's///' 以变换源文件中的字和语法时分外方便。要对一个地址履行多个敕令,可在文件中输入 sed 敕令,然后应用 '{ }' 字符将这些敕令分组,如下所示:

1,20{   s/[Ll]inux/GNU/Linux/g   s/samba/Samba/g   s/posix/POSIX/g }

上例将把三个调换敕令利用到第 1 行到第 20 行(包括这两行)。还可以应用规则表达式地址或者二者的组合:

1,/^END/{     s/[Ll]inux/GNU/Linux/g     s/samba/Samba/g     s/posix/POSIX/g   p }

该例将把 '{ }' 之间的所有敕令利用到从第 1 行开始,到以字母 "END" 开始的行停止(假如在源文件中没发明 "END",则到文件停止)的所有行。

附加、插入和变动行

既然在零丁的文件中编写 sed 脚本,我们可以使用附加、插入和变动行敕令。这些敕令将在当前行之后插入一行,在当前行之前插入一行,或者调换模式空间中确当前行。它们也可以用来将多行插入到输出。插入行敕令用法如下:

i This line will新蒲京澳门app下载 be inserted before each line

假如不为该敕令指定地址,那么它将利用到每一行,并孕育发生如下的输出:

This line will be inserted before each line line 1新蒲京澳门app下载 here

This line will be inserted before each line line 2 here

This line will be inserted before each line line 3 here

This line will be inserted before each line line 4 here

假如要在当前行之前插入多行,可以经由过程在前一行之后附加一个反斜杠来添加附加行,如下所示:

i insert this line and this one and this one and, uh, this one too.

附加敕令的用法与之类似,然则它将把一行或多行插入到模式空间中确当前行之后。其用法如下:

a insert this line after each line. Thanks! :)

另一方面,“变动行”敕令将实际 调换模式空间中确当前行,其用法如下:

c You're history, original line! Muhahaha!

由于附加、插入和变动行敕令必要在多行输入,以是将把它们输入到一个文本 sed 脚本中,然后经由过程应用 '-f' 选项奉告 sed 履行它们。应用其它措施将敕令通报给 sed 会呈现问题。

下一篇

鄙人一篇、也是本 sed 系列的着末一篇文章中,我将为您演示许多应用 sed 来完成不合类型义务的极佳实例。我将不仅为您显示脚本做些什么,还显示 为什么那样做。完成之后,您将掌握更多有关若何在不合项目中应用 sed 的极佳常识。到时刻见!

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: