linux 脚本替换文件内容,Shell脚本之——文本文件中的替换操作

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

执行文本替换程序是 sed——流编辑器(Stream Editor),它以批处理的方式来编辑文件。

虽然sed的命令很多,能做许多复杂的工作,但它最常用的还是处理输入流的文本替换,通常是作为管道的一部分。因此,在本篇正文中主要介绍sed的替换命令。

正文

1 基本语法sed [ -n ] 'editing command' [ file ... ]

sed [ -n ] -e 'editing command' ... [ file ... ]

sed [ -n ] -f script-file ... [ file ... ]sed [-nefri] ‘command’ 输入文本

2 主要选项

2.1 常用选项-n:使用安静(silent)模式。在一般sed的用法中,所有来自stdin的资料一般都会被列出到屏幕,但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者command)才会被列出来。(即只打印匹配行)

-e:允许多点编辑

-f:直接将sed的动作写在一个档案内,-f filename 则可以执行filename内的sed动作

-r:sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)

-i:直接修改读取的档案内容,而不是由屏幕输出

2.2 常用Commanda:新增。a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

c:取代。c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行

d :删除。因为是删除啊,所以d后面通常不接任何东西

i:插入。i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

p :列印。亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作

s :取代。可以直接进行取代的工作。通常这个 s 的动作可以搭配正规表示法。例如:1,20s/old/new/g

3 替换命令

在sed中使用s命令进行替换操作。

3.1 实例1:基本用法# 排序列表并删除重复部分

sed 's/:.*//'' /etc/passwd | sort -u

在这里,/字符扮演定界符(delimiter)的角色,从而分隔正则表达式与替代文本(replacement text),以及可选用的标志。

除了斜杆以外还可以使用其他任意字符作为定界符。

3.2 实例2:全局替换——/g

在s命令里以g结尾表示全局性(global),即替代文本取代正则表达式中每一个匹配。如果不设置g,只会取代第一个匹配。# 输入样本

echo Tolstoy reads well. Tolstoy writes well. > example.txt

# 没有设置g

sed 's/Tolstoy/Camus/' < example.txt

# 输出数据为:Camus reads well. Tolstoy writes well.

# 设置了g

sed 's/Tolstoy/Camus/g' < example.txt

# 输出数据:Camus reads well. Camus writes well.

3.3 实例3:指定替代第n个匹配

在结尾指定数字,指示第n个匹配出现才要被取代。# 仅替代第2个匹配

sed 's/Tolstoy/Camus/2' < example.txt

3.4 实例4:给予sed多个命令

通过-e给予sed多个命令。每一个编辑命令都使用一个-e选项。sed -e 's/foo/bar/g' -e 's/chicken/cowg' myfile.xml > myfile2.xml

3.5 实例5:将编译命令放入脚本

如果有很多要编辑的项目,可以将编辑命令全放进一个脚本里,再使用sed搭配-f:$ cat fixup.sed

s/foo/bar/g

s/chicken/cow/g

s/draft animal/horse/g

...

$ sed -f fixup.sed myfile.xml > myfile2.xml

3.6 实例6:从此替换整个文本——&

&在替代文本里表示的意思是:从此点开始替代成匹配于正则表达式点整个文本。mv atlga.xml atlga.xml.old

sed 's/Atlanta/&, the capital of the South/' < atlga.xml.old > atlga.xml

因此,若要在替代文本中使用&字符的字面意义,需要使用反斜杆对它进行转义:sed 's/\/&bsol;/g'

3.7 实例7:打印与否——/p

-n选项修改了sed的默认行为。当使用-n选项时,sed将不会在操作完成后打印模式空间的最后内容。反之,若在脚本中使用p,则会明白地将此行显示出来。sed -n '//p' *.html # 仅显示这行

4 删除命令

假设文件名为ab.sed '1d' ab #删除第一行

sed '$d' ab #删除最后一行

sed '1,2d' ab #删除第一行到第二行

sed '2,$d' ab #删除第二行到最后一行

以上删除操作即删除相应行后,其他行信息被打印,但源文件的信息不变。

删除后写入另一文件:sed '1d' ab > ab_test

删除所有包含writing的行:sed '/writing/d' sed_test

5 打印命令

打印所有行以及匹配到This的行:sed '/This/p' sed_test

若需只打印匹配到的信息,加入-n:sed -n '/This/p' sed_test

打印出1-2行:sed '1,2p' sed_test

6 关于空间模式

sed读取每个文件,一次读一行,将读取的行放到内存的一个区域——称之为模式空间(pattern space)。

这就像程序语言里的变量一样:内存的一个区域在编辑命令的提示下可以修改,所有编辑上的操作都会应用到模式空间的内容。

当所有操作完成后,sed会将模式空间的最后内容打印到标准输出,再回到开始处,读取另一个输入行。

参考资料

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值