shell文本处理三剑客—sed

sed

sed是stream editor(流编辑器)的缩写。它最常见的用法是进行文本替换。sed用来操作纯ASCII码的文本,处理时,把当前处理的行存储在临时缓冲区,称为"模式空间"(pattern space),可以指定仅仅处理哪些行,符合模式条件的处理,不符合条件的不予处理,处理完成后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。

相关选项

-n、–quiet、–silent:只输出明确处理过的内容。
-e script 、–expression=script:指定脚本。
-f script-file、–file=script-file:指定脚本文件。
-i[SUFFIX]、–in-place[=SUFFIX]:在原文件上修改并取代原文件。这一选项暗含-s。
-l N、–line-length=N:指定“l”命令的换行期望长度。长度为0则意味着不含长换行。如果不指定,则换行长度为70。
–posix:GUN sed包含了几个扩展POSIX sed。为了简化书写这些便携脚本,这个选项禁用了这个手册所有的扩展以及附加命令。扩展中被POSIX执行的外部语法大部分接受sed程序,但是以上这些中的一些(例如在报告bug中的N命令描述的行为)事实上违反了标准。如果你需要禁用后期的扩展,你可以设置POSIXLY_CORRECT 变量为以非空值。
-b、–binary:这个选项在每个平台都是可用的,仅仅在操作系统中区分文本文件与二进制文件起到作用。
–follow-symlinks:这个选项仅在支持符号连接且对选项-i被指定有影响的情况下可用。在这种情况下,如果被指定文件在命令行中是一个符号连接,sed将跟随连接并编辑连接的最终目标文件。默认行为是中断符号连接,因此连接目标将不被修改。
-E、-r:扩展正则表达式。
-s、–separate:在上文中已经举过例子,当处理多个输入文件,一般会被合并成一个文件来处理。使用这个选项则可以让sed把各个文件分开单独处理。
–sandbox:沙盒,在沙盒模式,e/w/r命令被拒绝-如果程序包含它们则还没运行时它们将丢弃。沙盒模式确保了sed在输入文件上的操作运行在指定的命令行上,而不能运行在外部命令上.
-u、–unbuffered:从输入文件读取最少的数据,更频繁的刷新输出。这将特别有用,特别像在tail -f这种情况下,能够让我们尽快地看出输出结果。
-z、–null-data、–zero-terminated:把输出看作一个一个被0字节(如:ASCII中的“NULL”)的中断符代替换行的集合。这个选项常和“sort -z”和“find -print0”一起使用。

实战演练

1、sed可以使用另一个字符串来替换匹配模式。模式可以是简单的字符串或者正则表达式
sed ‘s/#/*/’ fstab
将文件中所有的#全部替换为*
在这里插入图片描述2、可以将sed用在管道中
cat /etc/passwd | cut -d : -f1,3 | sed 's/?-UUID :/'
将/etc/passwd文件中的1-3列中的:全部替换为-UUID :
在这里插入图片描述
3、选项-i会使得sed用修改后的数据替换原始文件中的内容
sed -i ‘s/#/*/’ fstab
在这里插入图片描述
4、之前的例子只替换了每行中模式首次匹配的内容。g标记可以使sed执行全局替换
sed ‘s/:/=/g’ passwd
在这里插入图片描述
echo -e “THISTHISTHISTHIS” | sed 's/THIS/this/g’
在这里插入图片描述
/#g标记可以使sed替换第N次出现的匹配<第N次及以后>
echo -e “THISTHISTHISTHIS” | sed 's/THIS/this/2g’
在这里插入图片描述
echo -e “THISTHISTHISTHIS” | sed 's/THIS/this/3g’
在这里插入图片描述
5、sed命令会将s之后的字符视为命令分隔符。这允许我们更改默认的分隔符’/:’
sed 's:text:replace:g’
sed 's|text|replace|g’
如果作为分隔符的字符出现在模式中,必须使用\对其进行转义
sed 's|te|xt|replace|g
\|是出现在模式中被转义的分隔符

补充内容

sed命令可以使用正则表达式作为模式,另外还包括了大量可用于文本处理的选项
1、移除空行
有了正则表达式的支持,移除空行不过是小菜一叠。空行可以用正则表达式^$进行匹配。
最后的/d告诉sed不执行替换操作,而是直接删除匹配到的空行
sed '/^$/d file
在这里插入图片描述
2、直接在文件中替换
如果将文件传递给sed,它会将文件内容输出到stdout。要是我们想就地(in place)修改文件内容,可以使用选项-i
sed ‘s/pattern/replace_string/’ -i filename
例如,使用指定的数字替换文件中所有3位的数字
sed -i ‘s/\b[0-9]{3}\b/NUMBERS/g’ sed_data
在这里插入图片描述
上面的单行命令只替换了所有的3位数字。正则表达式\b[0-9]{3}\b用于匹配3位数字。[0-9]表示数字取值范围是从0到9.{3}表示匹配之前的项3次,{3}中的\用于转义{和},\b表示单词边界。
有一种值得推荐的做法是先使用不带-i选项的sed命令,以确保正则表达式没有问题,如果结果符合要求,再加入-i选项将更改写入文件。另外,你也可以使用下列形式的sed:
sed -i.bak ‘s/abc/def/’ file
这时的sed不仅替换文件内容,还会创建一个名为file.bak的文件,其中包含着原始文件内容的副本
在这里插入图片描述
3、已匹配字符串标记(&)
在sed中,我们可以用&指代模式所匹配到的字符串,这样就能够在替换字符串时使用已匹配的内容
echo this is an example | sed 's/\w+/[&]/g’
在这里插入图片描述
在这个例子中,正则表达式\w+匹配每一个单词,然后我们用[&]替换它,
&对应之前所匹配到的单词。

4、子串匹配标记(\1)
&指代匹配给指定模式的字符串。我们还可以使用#来指定出现在括号中的部分正则表达式(注:子模式)所匹配到的内容
echo this is digit 7 in a number | sed 's/digit ([0-9])/\1/'
在这里插入图片描述
这条命令将digit 7替换为7。(pattern)用于匹配子串。在本例中匹配到的子串是7.子模式被放入使用反斜线转义过的()中。对于匹配到的第一个子串,其对应的标记是\1,匹配到的第二个子串是\2,往后依次类推。
echo seven EIGHT | sed 's/([a-z]+) ([A-Z]+)/\2 \1/'
在这里插入图片描述
([a-z]+) 匹配第一个单词, ([A-Z]+)匹配第二个单词。\1和\2分别用来引用这两个单词。这种引用形式叫做向后引用(back reference)。在替换部分,他们的次序被更改为\2 \1,因此就呈现出了逆序的结果。

5、组合多个表达式
可以利用管道组合多个sed命令,多个模式之间可以用分号分隔,或是使用选项 -e PATTERN
sed ‘expression’ | sed 'expression’
它等同于:
sed -e ‘expression’ -e 'expession’
或者:
sed 'expression; expression’
考虑以下示例:
echo abc | sed ‘s/a/A/’ | sed 's/c/C/'
echo abc | sed -e ‘s/a/A/’ -e 's/c/C/'
echo abc | sed 's/a/A/; s/c/C/'
在这里插入图片描述

6、引用
sed表达式通常用单引号来引用。不过也可以使用双引号。shell会在调用sed前会先扩展双引号中的内容。如果想在sed表达式中使用变量,双引号就能派上用场了。
例如:
text=hello
echo hello world | sed “s/$text/HELLO/”
$text的求值结果是hello
在这里插入图片描述

sed的各种模式操作

p显示
d删除
a添加
c替换
w写入
i插入

这些模式有的在前面的介绍中出现过,下面来具体说说每一个的功能
1、p模式操作——显示操作
sed -n ‘/:/p’ fstab ##显示有冒号的行
在这里插入图片描述
sed -n ‘/UUID$/p’ fstab ###显示以UUID结尾的行
sed -n ‘/^UUID/p’ fstab ###显示以UUID开头的行
在这里插入图片描述
cat -n fstab | sed -n ‘2,6p’ ###显示fstab文件的2-6行
在这里插入图片描述
cat -n fstab | sed -n ‘2,6!p’ ###不显示fstab文件的2-6行
在这里插入图片描述
2、d模式操作——删除操作
sed ‘/^UUID/d’ fstab ##删除以UUID开头的行
在这里插入图片描述
sed ‘/^#/d’ fstab ###删除以#开头的行
在这里插入图片描述

sed ‘/^$/d’ fstab ###删除fstab文件中的空白行(第一行)
在这里插入图片描述
sed ‘1,4d’ fstab ###删除1-4行
在这里插入图片描述
3、a模式操作——添加操作(在指定行之后)
sed ‘/^UUID/ahello’ fstab ###在以UUID开头的行后添加hello
在这里插入图片描述
sed ‘/^UUID/ahello\nwestos‘ fstab ####在以UUID开头的行后添加hello然后换行添加westos
在这里插入图片描述
4、i模式操作——添加操作(在指定行之前)
sed ‘/^UUID/ihello’ fstab’ ###在以UUID开头的行之前添加hello
在这里插入图片描述
5、c模式操作——替换操作
sed ‘/^UUID/c\hello’ fstab ###将以UUID开头的行替换为hello
在这里插入图片描述
6、w模式操作——将输出写入文件
sed ‘/^UUID/w/tmp/fstab.txt’ fstab ###将以UUID开头的行写入tmp/fstab.txtz中
在这里插入图片描述

sed的一些其他用法

1、sed ‘/^UUID/=’ /etc/fstab ###给以UUID开头的行前面添加行号
在这里插入图片描述
2、sed ‘6r /etc/issue’ /etc/fstab ###将/etc/issue文件中的内容添加进fstab文件的第6行之后
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值