操作 sed & awk (3) 基础-sed 命令

35 篇文章 1 订阅
6 篇文章 0 订阅

Topic 1 替换

s/reg/replace/flags

flags:

 n  1-512之间,指定第几次出现匹配时替换

 g  全局

 p   打印模式空间的内容

 w  file  将模式空间写到file中


replace: 特殊含义字符

 & 用正则表达式匹配的内容进行替换

 \n 匹配第n个子串,这个子串以前在pattern中用“\(”和'\)'指定

  \  转义(如& \等)


Topic 2 删除

注1:前面说过分组命令都会作用到一行上面,如果先删除那么后面的命令将不再生效!!

那么删除命令可以改变脚本的控制流

高级删除货待续


Topic 3 追加、插入和更改

追加:a

插入:i

更改:c

[line-address]a\

text

不常用略


Topic 4 列表 l

显示模式空间的内容 l ,可以打印不可见内容如 ^M  显示为字符\r

sed -n -e 'l'  file


Topic 5 转换 y 最小助记符

[address]y/abc/xyz

所有的a替换为x, 形如tr


Topic 6 打印P  P命令不会影响模式空间,不改变脚本控制流,常用在改变控制流命令之前(d,N,b),如果sed不带-n参数,将会“重复”输出

#4.txt
zk "abc"  #1#
zk "bcd"  #2#
asf
zk "123"  #3#
bbb
zk 123    #4#


#4.sed
/^\zk/{
p
s/"//g
s/#//2
s/^\zk//p
}

注意,第一个p命令只是输出了模式空间的内容,即整行;最后一个命令也是输出了模式空间的内容,即最终的处理结果,

整个sed执行完成之后模式空间的内容将输出到标准输出流,所以最终结果有两行。

如果要去掉本身的模式空间输出,使用sed的-n参数

sed -f 4.sed 4.txt
zk "abc"  #1#
 abc  #1
 abc  #1
zk "bcd"  #2#
 bcd  #2
 bcd  #2
asf
zk "123"  #3#
 123  #3
 123  #3
bbb
zk 123    #4#
 123    #4
 123    #4

sed -nf 4.sed 4.txt
zk "abc"  #1#
 abc  #1
zk "bcd"  #2#
 bcd  #2
zk "123"  #3#
 123  #3
zk 123    #4#
 123    #4

打印行号 =

sed '=' 会打印行号(没-n打印行号之后会在下一行打印原始内容)

cat 4.txt | sed '=' | sed 'N;s/\n/:/'   
这样可以打印行号+内容
1:zk "abc"  #1#
2:zk "bcd"  #2#
3:asf
4:zk "123"  #3#
5:bbb
6:zk 123    #4#

N命令将第二行追加到模式空间,那么读一行时等于 line1\nline2

使用 sed -n  'N;s/\n/xxx/'  可以转换为 line1xxxline2

echo -e "1\n2\n3\n4" | sed -n 'N;s/\n/ /;p'
sed先读入第一行到pattern space,然后执行N命令,将第二行追加进pattern space
这时pattern space里面就是1\n2,然后执行s/\n/ /,将换行符替换成空格,最后打印。


Topic 7 下一步 n (有点像环视)跳过当前行模式空间,直接读取下一行进模式空间

/^zk/{
n
/^$/d
}

<span style="font-size:18px;">zk

124

123
zk
567</span>

zk
124

123
zk
567

当读到zk开头的行时,直接跳到下一行如果这一行是空行则删除。


Topic 8 r,w 读写文件(待续)

[line-address]r file   将文件内容附加到匹配行的后面,注意读入的内容不受-n限制,仍然会输出

[addrress]w  file  将特定行写入到特定文件(有点像 grep -e '/reg/' > file)

/^zk/r 8.list
/^zk/d

将8.list的内容添加到所有以zk开头的行后面,再删除原始的zk行;效果等于将所有的zk行替换为文件

---------------------------------------------------------------------

tom classA

terry classB

marry classB

tusiki classC

xiaoming classA

----------------------------------------------------------------------

分类输出,并消除类别

/classA$/{

s///

w  A.txt

}

将所有A类别的行消掉类别后输出到文件A.txt里


Topic 9 退出 q 停止读取新的行(控制),它可以节约时间(终止无用循环)

e.g sed '100q'  打印1-100行  形如head

比较:

for file

do

sed  10q $file

done

-----------------------------------

for file

do

sed -n 1,10p $file

done


注意后者将10行之后也处理了,只是没有输出。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值