《 Linux Shell 》笔记之sed

在日常工作中,sed是一个实用的文本文件处理工具。由于它是一个非交互式方式,它处理的文本文件包括:来自键盘输入、文件重定向、字符串、变量、来自管道的文本等等。

sed主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法

sed命令行格式为:

         sed[-nefri] ‘command’输入文本     

sed:全称stream editor (流编辑器)

sed输出文本文件的保存,有两种方式:

  • 使用>符号,输出到一个新文件 见例子:输出到新文件
  • 在原始文件上修改且保存 见例子:直接修改原文件内容,替换指定行的所有内容

sed调用的三种方式:

  • 直接在shell命令行上调用见例子:显示数据
  • sed命令插入脚本文件后,通过sed命令调用脚本见例子:通过sed命令调用脚本
  • sed命令写入脚本文件后,将其+x变成可执行,需要在文件头部加上 #!/bin/sed 见例子:将sed命令写入脚本文件

常用选项:

        -n使用安静(silent)模式。通常 p 会与参数 sed -n一起运作。(见例子:显示数据

       -e直接在指令列模式上进行 sed的动作编辑。(见例子:多点编辑)

       -f直接将 sed的动作写在一个档案内, -f filename则可以执行 filename内的sed动作;见例子:通过sed命令调用脚本

       -rsed的动作支援的是延伸型正规表示法的语法。(见例子:sed -r 例子)

       -i直接修改读取的档案内容,而不是由萤幕输出。(见例子:直接修改原文件内容,替换指定行的所有内容)       

常用命令:

        a  新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行) (见例子:在第一行之后,插入tea

       c   取代, c的后面可以接字串,这些字串可以取代 n1,n2之间的行!(见例子:替换第一行

       d   删除,因为是删除啊,所以 d后面通常不接任何咚咚;(见例子:删除第一行

        i   插入, i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);(见例子:在第一行之前,插入tea

        p  列印,亦即将某个选择的资料印出。通常 p会与参数 sed -n一起运作~ (见例子:显示数据

        s  取代,可以直接进行取代的工作哩!通常这个 s的动作可以搭配正规表示法!格式: s/old/new/g,(见例子:替换一行中的某部分



高级command:

命令

功能描述

h

拷贝pattern space的内容到holding buffer(特殊缓冲区)。

H

追加pattern space的内容到holding buffer。

g

获得holding buffer中的内容,并替代当前pattern space中的文本

G

获得holding buffer中的内容,并追加到当前pattern space的后面

n

读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。

p

打印pattern space中的第一行。  //大写

q

退出sed。

w file

写并追加pattern space到file的末尾。

!

表示后面的命令对所有没有被选定的行发生作用。

s/re/string

用string替换正则表达式re。

=

打印当前行号码

替换标记

 

g

行内全面替换,如果没有g,只替换第一个匹配。

x

互换pattern space和holding buffer中的文本。

y

把一个字符翻译为另一个字符(但是不能用于正则表达式)。


举例:(假设我们有一文件名为SedTxt,SedTxt_2

SedTxt内容如下:

Hello
Welcometo @LinuxShell World
Goodbye Linux

SedTxt_2内容如下:

TABASENAME=Apple
DATABASEURL="jdbc:oracle:thin:@172.10.10.10:1521:11g2"

##### #####显示数据###########
#
显示第一行

test@sha:~/tmp> sed -n'1p' SedTxt    
Hello

#显示最后一行

test@sha:~/tmp> sed -n'$p' SedTxt
Goodbye Linux

#显示第一行到第二行

test@sha:~/tmp> sed -n'1,2p' SedTxt
Hello
Welcome to @LinuxShell World

##### #####模糊查询显示数据##########
格式:sed -n '/查询的关键字/p'输入文件
#
查询包括关键字Linux所在所有行

test@sha:~/tmp> sed -n'/Linux/p' SedTxt
Welcome to @LinuxShell World
GoodbyeLinux

#查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

格式:sed -n '/关键字/p'输入文件

test@sha:~/tmp> sed -n'/\@/p' SedTxt
Welcome to @LinuxShell World

##### #####新增数据##########
格式:sed '[行位置]a'输入文件
#在第一行之后,插入tea

test@sha:~/tmp> sed '1a tea' SedTxt
Hello
tea
Welcome to @LinuxShell World
GoodbyeLinux

#在第一行和第二行之后,插入tea

方法1:

test@sha:~/tmp>sed '1,2a tea' SedTxt
Hello
tea
Welcometo @Linux Shell World
insert
GoodbyeLinux

#在第一行之后,插入多行(如tea和or orange)

test@sha:~/tmp>sed '1a tea\nor orange' SedTxt
Hello
tea
or orange
Welcometo @Linux Shell World
GoodbyeLinux

#在第一行之前,插入tea

test@sha:~/tmp> sed '1i tea' SedTxt
tea
Hello
Welcome to @Linux Shell World
GoodbyeLinux

#在行头和行尾,插入head,tail

test@sha:~/tmp> sed's/^/head&/g' SedTxt
headHello
headWelcome to @LinuxShell World
headGoodbye Linux

test@sha:~/tmp> sed 's/$/&tail/g'SedTxt
Hellotail
Welcome to @LinuxShell Worldtail
Goodbye Linuxtail

#第二行的行头和行尾,插入head,tail

test@sha:~/tmp> sed '2s/^/head&/g' SedTxt
Hello
headWelcome to @LinuxShell World
Goodbye Linux

test@sha:~/tmp> sed '2s/$/&tail/g'SedTxt
Hello
Welcome to @LinuxShell Worldtail
Goodbye Linux

Note:
^ 表示行头,$表示行尾
文本替换格式:sed 's/要替换的字符串/新的字符串/g'  (要替换的字符串可以用正则表达式)/g表示每行出现的全部替换

#在所有的行头和行尾,插入headtail

test@sha:~/tmp> sed '/./{s/^/HEAD&/;s/$/&TAIL/}' SedTxt
HEADHelloTAIL
HEADWelcome to @LinuxShell WorldTAIL
HEADGoodbye LinuxTAIL

##### #####替换数据###### #####

#替换第一行

test@sha:~/tmp>sed '1c Good Morning' SedTxt
GoodMorning
Welcometo @Linux Shell World
GoodbyeLinux

#替换第一行到第二行

test@sha:~/tmp>sed '1,2c Good Morning' SedTxt
GoodMorning
GoodbyeLinux

#替换一行中的某部分
格式:
sed 's/要替换的字符串/新的字符串/g'  (要替换的字符串可以用正则表达式)


#替换Linux为Python,输出到其它文件 (只要加上 ><filename>)

test@sha:~/tmp>sed -n '/Linux/p' SedTxt |sed 's/Linux/Python/g' SedTxt> output
Hello
Welcometo @Python Shell World
GoodbyePython

#使用替换,删除所在行的Linux

test@sha:~/tmp>sed -n '/Linux/p' SedTxt |sed 's/Linux//g' SedTxt
Hello
Welcometo @ Shell World
Goodbye

#搜索Linux,找到welcome对应的行,并且把Linux替换为redshell
执行后面花括号中的一组命令,每个命令之间用分号分隔
p打印,q退出
格式:
sed /搜索关键字/p文件名| sed -n'/对应关键字/{s/要替换字符/新的字符/;p;q}'

test@sha:~/tmp> sed/Linux/p SedTxt |sed -n '/Welcome/{s/Linux/redshell/;p;q}'
Welcome to @redshellShell World

#直接修改原文件内容,替换指定行的所有内容
格式:sed 's/要替换的字符串/新的字符串/g'  (要替换的字符串可以用正则表达式)/g表示每行出现的全部替换

替换前(SedTxt_2)

DATABASENAME=apple
jdbc:oracle:thin:@172.10.10.10:1521:11g2

test@sha:~/tmp>sed -i '1 s/[^ ]*$/DATABASENAME=orange/g' SedTxt_2
test@sha:~/tmp>sed -i '2 s/[^ ]*$/jdbc:oracle:thin:@172.20.20.20:1521:11g2/g' SedTxt_2

替换后(SedTxt_2)

DATABASENAME=orange
jdbc:oracle:thin:@172.20.20.20:1521:11g2

Note: [^ ]*$:除空格之外的所有内容

[^] -匹配未包含空格的任意字符,$ -匹配输入字符串的结束位置“\n”或“\r”,* -  匹配结束位置之前的所有字符

##### #####删除数据###### #####

#删除第一行

test@sha:~/tmp>sed '1d' SedTxt
Welcometo @Linux Shell World
GoodbyeLinux

#删除最后一行

test@sha:~/tmp>sed '$d' SedTxt
Hello
Welcometo @Linux Shell World

#搜索linux,删除所在行

test@sha-colline-node-h:~/tmp>sed '/Linux/d' SedTxt
Hello

##### ##### 多点编辑##### ######

#删除第一行,并将Linux替换为RedShell

test@sha-colline-node-h:~/tmp>sed -e '1d' -e 's/Linux/RedShell/g' SedTxt
Welcometo @RedShellShell World
GoodbyeRedShell

##### #####通过sed命令调用脚本##########

# file1.sed里的内容

test@sha:~/tmp> cat file1.sed
s/this/it/
s/test/sedtest/

#file2.sed里的内容

test@sha:~/tmp>cat file2.sed
this is atest

#通过sed命令调用脚本

test@sha:~/tmp>sed -f file1.sed file2.sed
it is ased test

##### ##### sed -r例子##### #####

如果不使用-r,需要在正则表达式中需要使用转移符\, 如果使用-r,就可以不使用转移符\

#使用转移符\

Test@sha:~/tmp>echo "aaa bbb "|sed 's/\(.\)/A/'
Aaa bbb

#不使用转移符\

test@sha:~/tmp>echo "aaa bbb "|sed  's/(.)/A/'
aaa bbb

#使用-r,代替不使用转义符

test@sha:~/tmp>echo "aaa bbb "|sed -r 's/(.)/A/'
Aaa bbb 

##### #####sed命令写入脚本文件后,将其+x变成可执行##### #####

sed命令写入脚本文件input.sed如下:

#!/bin/bash
#!/bin/sed
echo "aaabbb" |sed -n '1p'

##### ####输出到新文件##### #####

test@sha:~/tmp>echo "aaa bbb"| sed -n '1p' >output.sed
test@sha:~/tmp>cat output.sed
aaa bbb

test@sha-colline-node-h:~/tmp>chmod+x input.sed
test@sha-colline-node-h:~/tmp>./input.sed
aaa bbb

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sed是一个强大的文本处理工具,常用于从标准输入或文件中读取文本,进行编辑和转换,并将输出写入标准输出或文件中。 以下是sed常用的命令选项: 1. -n:只显示经过sed编辑的行 2. -i:直接修改文件内容,不输出到终端 3. -e:允许多个命令一起执行 4. -f:从文件中读取sed命令进行处理 以下是sed常用的命令: 1. s:替换。语法为:s/要替换的内容/替换后的内容/g,其中g表示全局替换。 2. p:打印。将指定的行或所有行输出到终端。 3. d:删除。删除指定的行或所有行。 4. a:追加。在指定行后面添加新的内容。 5. i:插入。在指定行前面插入新的内容。 6. w:写入。将指定行写入到文件中。 举例说明: 1. 将文件中的所有"cat"替换为"dog":sed -i 's/cat/dog/g' file.txt 2. 只显示文件中包含“hello”的行:sed -n '/hello/p' file.txt 3. 删除文件中的第3行:sed -i '3d' file.txt 4. 在文件中第2行后面添加一行内容:“hello world”:sed -i '2a hello world' file.txt 5. 将文件中第1行替换为“hello”并保存到另一个文件中:sed '1s/.*/hello/' file.txt > newfile.txt ### 回答2: sed是一种常用的Linux命令,其全称为Stream Editor,用于对文本进行处理和转换。它可以在命令行中以各种方式对文件内容进行修改,包括替换、插入、删除、追加等操作。 sed的基本语法是`s/old/new/`,其中old表示待替换的字符串,new表示替换后的内容。sed命令会读取文件的内容,并对匹配到的old进行替换。如果需要对整个文件进行替换,则需要加上选项`-i`。 除了替换以外,sed还可以实现很多其他的文本操作。例如,通过`d`选项可以删除匹配到的行;通过`i`选项可以在指定行前插入文本;通过`a`选项可以在指定行后追加文本等。 另外,sed命令还可以使用正则表达式来进行模式匹配。通过在替换语句中使用正则表达式,可以对符合特定模式的字符串进行批量替换。 总之,sed是一种非常强大和灵活的文本处理工具,可以方便地对文件内容进行修改和转换,提高工作效率。熟练掌握sed命令可以帮助我们更好地处理和编辑文本文件。 ### 回答3: sed(Stream Editor)是Linux中常用的文本处理工具之一。它可以对文本进行流式编辑,具体操作包括查找、删除、替换、插入行或字符等。 使用sed命令的基本语法为: ``` sed [选项] '动作' 文件名 ``` 其中,选项可以包括: - -n:只显示或处理特定行; - -e:指定要执行的动作; - -f:从指定文件中读取动作。 动作部分可以包括: - 数字n:表示打印第n行; - p:打印匹配行; - d:删除匹配行; - s/old/new/:查找并替换文本; - a\text:在匹配行后插入文本; - i\text:在匹配行前插入文本。 以下是一些常用的sed命令示例: - 打印文件内容: ``` sed 'p' file.txt ``` - 删除匹配行: ``` sed '/pattern/d' file.txt ``` - 查找并替换文本: ``` sed 's/old/new/' file.txt ``` - 打印指定行数: ``` sed -n 'n' file.txt ``` - 在匹配行后插入文本: ``` sed '/pattern/a\text' file.txt ``` - 在匹配行前插入文本: ``` sed '/pattern/i\text' file.txt ``` 通过灵活运用sed命令,我们可以轻松地对文本文件进行各种编辑操作,提高工作效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值