shell命令之sed

选项:

-n:一般sed命令会把所有数据都输出到屏幕,如果加入-n选项的话,则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入数据应用多条sed命令编辑。 
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。

动作:

a:追加,在当前行后添加一行或多行。 
c:行替换,用c后面的字符串替换原数据行。 
i:插入,在当前行前插入一行或多行。 
p:打印,输出指定的行。 
s:字符串替换,用一个字符串替换另外一个字符串。格式为'行范围s/旧字符串/新字符串/g' 
   (如果不加g的话,则表示只替换每行第一个匹配的串)

1、删除:d命令

sed ‘2d’ sed.txt -----删除sed.txt文件的第二行。
sed ‘2, d ′ s e d . t x t − − − − − 删 除 s e d . t x t 文 件 的 第 二 行 到 末 尾 所 有 行 。 s e d ′ d' sed.txt -----删除sed.txt文件的第二行到末尾所有行。 sed ' dsed.txtsed.txtsedd’ sed.txt -----删除sed.txt文件的最后一行。
sed '/test/d ’ sed.txt -----删除sed.txt文件所有包含test的行。
sed '/[A-Za-z]/d ’ sed.txt -----删除sed.txt文件所有包含字母的行。

2、整行替换:c命令

将第二行替换成hello world

sed '2c hello world' sed.txt

3、字符串替换:s命令

sed ‘s/hello/hi/g’ sed.txt

在整行范围内把hello替换为hi。如果没有g标记,则只有每行第一个匹配的hello被替换成hi。

sed 's/hello/hi/2' sed.txt

此种写法表示只替换每行的第2个hello为hi

sed 's/hello/hi/2g' sed.txt

此种写法表示只替换每行的第2个以后的hello为hi(包括第2个)

sed -n 's/^hello/hi/p' sed.txt		

(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的hello被替换成hi,就打印它。

sed -n '2,4p' sed.txt

打印输出sed.txt中的第2行和第4行

sed -n 's/hello/&-hi/gp' sed.txt
sed 's/^192.168.0.1/&-localhost/' sed.txt	
sed 's/^192.168.0.1/[&]/' sed.txt	

&符号表示追加一个串到找到的串后。所有以192.168.0.1开头的行都会被替换成它自已加 -localhost,变成192.168.0.1-localhost。第三句表示给IP地址添加中括号

sed -n 's/\(liu\)jialing/\1tao/p' sed.txt
sed -n 's/\(liu\)jia\(ling\)/\1tao\2ss/p' sed.txt

liu被标记为\1,所以liu会被保留下来(\1 == liu)
ling被标记为\2,所以ling也会被保留下来(\2 == ling)
所以最后的结果就是\1tao\2ss == “liu” + “tao” + “ling” + “ss”
此处切记:\1代表的是被第一个()包含的内容,\1代表的是被第一个()包含的内容,……
上面命令的意思就是:被括号包含的字符串会保留下来,然后跟其他的字符串比如tao和ss组成新的字符串liutaolingss

sed 's#hello#hi#g' sed.txt

不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,"#“在这里是分隔符,代替了默认的”/"分隔符。表示把所有hello替换成hi。
选定行的范围:逗号

sed -n '/today/,/hello/p' sed.txt

所有在模板today和hello所确定的范围内的行都被打印。都找第一个,也就是说,从第一个today到第一个hello

sed -n '5,/^hello/p' sed.txt
sed -n '/^hello/,8p' sed.txt

打印从第五行开始到第一个包含以hello开始的行之间的所有行。

sed '/today/,/hello/s/$/www/' sed.txt

对于模板today和hello之间的行,每行的末尾用字符串www替换。
sed ‘/today/,/hello/s/^/www/’ sed.txt
对于模板today和hello之间的行,每行的开头用字符串www替换。

sed '/^[A-Za-z]/s/5/five/g' sed.txt

将以字母开头的行中的数字5替换成fiv
4、多点编辑:e命令

sed -e ‘1,5d’ -e ‘s/hello/hi/’ sed.txt

(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用hello替换hi。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

sed --expression='s/hello/hi/' --expression='/today/d' sed.txt

一个比-e更好的命令是–expression。它能给sed表达式赋值。

5、从文件读入:r命令

sed ‘/hello/r file’ sed.txt

file里的内容被读进来,显示在与hello匹配的行下面,如果匹配多行,则file的内容将显示在所有匹配行的下面。

6、写入文件:w命令

sed -n '/hello/w file' sed.txt

在huangbo.txt中所有包含hello的行都被写入file里。

7、追加命令:a命令

sed ‘/^hello/a\—>this is a example’ sed.txt

'—>this is a example’被追加到以hello开头的行(另起一行)后面,sed要求命令a后面有一个反斜杠。

8、插入:i命令

sed '/will/i\\some thing new -------------------------' sed.txt

如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。

9、下一个:n命令

sed '/hello/{n; s/aa/bb/;}' sed.txt	    替换下一行的第一个aa
sed '/hello/{n; s/aa/bb/g;}' sed.txt	替换下一行的全部aa

如果hello被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。

10、退出:q命令

sed '10q' sed.txt

打印完第10行后,退出sed。

同样的写法:

sed -n '1,10p ' sed.txt

问题:
在一行数据特定位置加入一个字母

echo 'abc' | sed 's/a/&d/g'

11、删除包含指定关键字的行:

 sed -i '/helloword/d' test

12、删除指定行号的行

sed -i '2d' test

13、删首行

sed -i '1d' a.txt

14、删尾行s

sed -i '$d' b.txt

15、删空格

sed -i 's/[ ]*//g' c.txt

16、删空行

sed -i '/^$/d' d.txt

17、删包含string的行

sed -i ‘/love/d’ a.txt

18、sed命令使用双引号的情况下,可以使用$var(变量)直接引用:

echo | sed "s/^/$RANDOM.rmvb_/g" 13562.rmvb_

sed命令使用单引号的情况下,可以使用’"$var"'引用(单引号,然后双引号,变量)

 
echo | sed 's/^/'"$RANDOM"'.rmvb_/g' 2442.rmvb_

19、 sed中执行外部命令。
sed命令使用单引号的情况下使用’shell command‘或者’$(shell command)'引用命令执行的结果

echo | sed 's/^/'`echo $RANDOM`'.rmvb_/g' 7700.rmvb

# 上面的命令使用了旧式的命令替换,也可以采用新式的命令替换方法,如下
 echo | sed 's/^/'$(echo $RANDOM)'.rmvb_/g'  13856.rmvb
# 下面例子取用当前日期作为结果的一部分,如下:
echo | sed 's/^/'$(date +"%Y%m%d")'.rmvb_/g'20130401.rmvb

sed命令中使用双引号的情况下,直接shell command或者$(shell command)引用命令执行。

echo | sed "s/^/$(date +"%Y%m%d").rmvb_/g" 20130401.rmvb
# 使用环境变量$RANDOM以及旧式命令替换的例子:
echo | sed "s/^/`echo $RANDOM`.rmvb_/g" 29484.rmvb

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值