Linux下Sed命令的用法(之删除)

转自:http://loofeer.blog.51cto.com/707932/793320

接Linux下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

将处理发送给行
如果紧跟 b 之后没有指定任何标签,则处理转至脚本文件的末尾。

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

# 符号作为一行的第一个字符将使整行被当作注释处理。注释行与标签不同,不能使用 b 或 t 命令来转到注释行上。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linuxsed是一个非常强大的文本编辑工具,可以用来对文本文件进行各种各样的操作。以下是一些常见的sed命令用法: 1. 替换文本的字符串: sed 's/old_text/new_text/g' filename 这个命令将文件filename的所有出现old_text的字符串都替换成new_text。 2. 删除文本的某些行: sed '/pattern/d' filename 这个命令将文件filename匹配pattern的所有行都删除。 3. 在指定行前或后插入文本: sed '3i\insert_text' filename 这个命令将在文件filename的第3行前插入insert_text。 4. 在指定行后追加文本: sed '3a\append_text' filename 这个命令将在文件filename的第3行后追加append_text。 5. 只对匹配模式的行进行操作: sed '/pattern/ s/old_text/new_text/g' filename 这个命令将只对文件filename匹配pattern的行进行old_text到new_text的替换操作。 这些是sed的一些基本用法,还有许多其他的用法可以根据需要进行学习和使用。 ### 回答2: sed是一种文本处理工具,可以在Linux用于对文本进行编辑、替换、删除等操作。下面将从基本用法、实例应用和高级技巧三个方面来详细介绍sed命令的使用。 一、基本用法SED命令的基本语法为: sed [选项] ‘command’ filename 其,选项包括-i,-n和-e等,‘command’为sed命令的具体操作命令,filename为要操作的目标文件名。 常用的sed命令主要有: 1.替换操作(s命令):sed ‘s/old/new/g’ filename (g表示全局替换) 2.行删除操作(d命令):sed ‘nd’ filename (将文件的第n行删除) 3.行插入操作(i命令):sed ‘ni\insert content’ filename (在文件的第n行前插入内容) 4.行追加操作(a命令):sed ‘na\append content’ filename(在文件的第n行后追加内容) 5.删除连续重复行操作(uniq命令):sed ‘/./,/^$/!d’ filename(删除文件的所有重复行) 二、实例应用: 下面结合具体实例来介绍sed命令的使用。 1.替换字符串: 将filename的所有old字符串都替换成new字符串,可以使用命令sed -e 's/old/new/g' filename 2.删除行: 将filename的第10行删除,可以使用命令sed -e '10d' filename 3.行插入: 在filename第10行前插入vivisun,可以使用命令sed -e '10 i \vivisun' filename 4.行追加: 在filename第10行后追加vivisun,可以使用命令sed -e '10 a \vivisun' filename 5.删除连续重复行: 删除filename的所有重复行,可以使用命令sed -e '/./,/^$/!d' filename 三、高级技巧: 1.多重命令组合: 将多个命令组合在一起使用,可以同时实现多种操作。 例如,将文件的旧字符串old替换为新字符串new并删除空行,可以使用命令sed -e 's/old/new/g' -e '/^$/d' filename 2.使用正则表达式: sed命令可以使用正则表达式作为匹配模式,实现更加灵活的文本处理操作。 例如,替换一行的空格为制表符,可以使用命令sed -e 's/ \+/\\t/g' filename 总之,sed命令Linux非常实用的文本处理工具,在日常工作经常用到,同时也有着广泛的应用场景。因此,熟练掌握sed命令的基本用法、实例应用和高级技巧,会对Linux用户的文本处理工作带来极大的帮助。 ### 回答3: sed命令是在Linux常用的一种文本处理工具,它可以对文本进行编辑、替换、删除等操作。下面对sed命令用法进行详细介绍。 基本用法 sed命令的基本格式为:sed [options] 'pattern command' filename 其,pattern是模式,command是对模式匹配的行进行的操作,filename是需要处理的文件名。 1. 显示整个文件: sed '1,$!d' filename 2. 删除某一行: sed '3d' filename 3. 替换某个字符串: sed 's/oldstring/newstring/g' filename 其,g代表全局替换。 4. 在某行前加上某个字符串: sed '2i xxx' filename 5. 在某行后加上某个字符串: sed '2a xxx' filename 6. 给匹配到的行加上行号: sed '=' filename | sed 'N;s/\n/ /' 其,第一个sed是给每一行加上行号,第二个sed是去掉每行的换行符,并在行号后面加上一个空格。 高级用法 1. 从文件读取命令并执行: sed -f script.sed filename 2. 执行多个替换: sed -e 's/old1/new1/g' -e 's/old2/new2/g' filename 3. 用行号做模式匹配: sed -n '2,10p' filename -n是关闭自动打印,2,10p是只匹配2到10行,并将这些行打印出来。 4. 使用正则表达式做模式匹配: sed -n '/pattern/p' filename 总结 sed命令能够处理的文本内容不仅包括文件,还包括管道和重定向的数据流等。在处理大型文本文件时,sed是非常有用的工具,可以大大提高文件的处理效率。sed命令的应用领域非常广泛,熟练掌握其用法,对于linux命令行操作和文本处理都将有很大的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值