sed中在对内容进行修改时,有时候需要引用外部变量的值或者获取一个shell命令执行的结果,以便达到更加可观的输出结果

1、sed中使用变量替换
1)sed命令使用双引号的情况下,使用$var直接引用
[rooot@192 ~]$ cat test.txt
192.168.53.128/contiv/name
[rooot@192 ~]$ ip=192.168.53.77
[rooot@192 ~]$ sed -i "s/192.168.53.128/$ip/g" test.txt
[rooot@192 ~]$ cat test.txt
192.168.53.77/contiv/name
[rooot@192 ~]$
如果替换的变量内容中含有/符号则会提示错误,原因是从语法上看,没有任何问题;但由于变量中包含有“/”作为分隔符,这会和sed的替换操作的分隔符“/”引起混淆;所以,只要不使用“/”做分隔符就可以解决这个问题,如果使用“%”而不是“/”来作为sed的替换操作的分隔符,就不会出错。其实使用#或%或;作为分隔符也是可以的,只要不会与替换中有相同的而且不是元字符的特殊符号都是可以的
[rooot@192 chenwei]$ path=/home/root
[rooot@192 chenwei]$ cat test.txt
192.168.53.77/contiv/name
[rooot@192 chenwei]$ sed -i "s%192.168.53.77%$path%g" test.txt
[rooot@192 chenwei]$ cat test.txt
/home/root/contiv/name
[rooot@192 chenwei]$ sed -i "s#/home/root#192.168.53.77#g" test.txt
[rooot@192 chenwei]$ cat test.txt
192.168.53.77/contiv/name
[rooot@192 chenwei]$
2)sed命令使用单引号的情况下,使用'"$var"'引用,即变量用双引号括起来,外面再加上单引号
[rooot@192 chenwei]$ ip=192.168.0.34
[rooot@192 chenwei]$ cat test.txt
192.168.53.77/contiv/name
[rooot@192 chenwei]$ sed -i 's/192.168.53.77/'"$ip"'/g' test.txt
[rooot@192 chenwei]$ cat test.txt
192.168.0.34/contiv/name
[rooot@192 chenwei]$

2、sed中执行外部命令
1)sed命令使用单引号的情况下使用'`shell command`'或者'$(shell command)'引用命令执行的结果
[rooot@192 chenwei]$ cat test.txt
192.168.0.34/contiv/name
[rooot@192 chenwei]$ ip=192.168.0.56
[rooot@192 chenwei]$ sed -i 's/192.168.0.34/'`echo $ip`'/g' test.txt
[rooot@192 chenwei]$ cat test.txt
192.168.0.56/contiv/name
[rooot@192 chenwei]$
或者使用新式的命令
[rooot@192 chenwei]$ cat test.txt
192.168.0.56/contiv/name
[rooot@192 chenwei]$ ip=192.168.0.68
[rooot@192 chenwei]$ sed -i 's/192.168.0.56/'$(echo $ip)'/g' test.txt
[rooot@192 chenwei]$ cat test.txt
192.168.0.68/contiv/name
[rooot@192 chenwei]$
2.sed命令使用双引号的情况下直接`shell command`或者$(shell command)引用命令执行的结果
[rooot@192 chenwei]$ cat test.txt
192.168.0.68/contiv/name
[rooot@192 chenwei]$ ip=192.168.0.56
[rooot@192 chenwei]$ sed -i "s/192.168.0.68/$(echo $ip)/g" test.txt
[rooot@192 chenwei]$ cat test.txt
192.168.0.56/contiv/name

在sed语句里面,变量替换或者执行shell命令,双引号比单引号少绕一些弯子

3、一些小技巧

在每行的头添加字符,比如"HEAD",命令如下:
sed 's/^/HEAD&/g' test.file
在每行的行尾添加字符,比如“TAIL”,命令如下:
sed 's/$/&TAIL/g' test.file
1)"^"代表行首,"$"代表行尾
2)'s/$/&TAIL/g'中的字符g代表每行出现的字符全部替换,否则只会替换每行第一个,而不继续往后找了

4、直接修改文件的内容

直接编辑文件选项-i,会匹配test.txt文件中每一行的第一个This替换为this:
sed -i 's/This/this/' test.txt

5、shell变量的写法

${var} 变量var的值, 与$var相同

echo ${s1}${s2}   # 当然这样写 $s1$s2 也行,但最好加上大括号

6、shell支持逻辑与或的写法

[[]] 表达式
[root@localhost ~]# [ 1 -eq 1 ] && echo 'ok'
ok
[root@localhost ~]$ [[ 2 < 3 ]] && echo 'ok'
ok

[root@localhost ~]$ [[ 2 < 3 && 4 > 5 ]] && echo 'ok'
ok
注意:[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| &&

shell脚本知识点汇总的更多相关文章

  1. Shell脚本使用汇总整理——达梦数据库备份脚本

    Shell脚本使用汇总整理——达梦数据库备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html 脚本 ...

  2. Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本

    Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...

  3. Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本

    Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...

  4. Shell脚本使用汇总整理——文件夹及子文件备份脚本

    Shell脚本使用汇总整理——文件夹及子文件备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html ...

  5. Shell脚本使用汇总整理

    Shell脚本使用汇总整理 一.Shell脚本常用的头部格式: 头部的作用就是告知linux此脚本的类型: 常用的头部格式如下:(/bin/bash,是bash的路径,如果不知道路径可以通过which ...

  6. Shell脚本命令汇总中

    一.换行 echo -e 可以通过\n编译换行 echo -n不换行,如果加入了\n,则会打出“\n”字符 #!/bin/bash echo -e "O\nK\n!" echo & ...

  7. shell脚本语法基础汇总

    shell脚本语法基础汇总 将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n) out=$(cat text.txt) 输出1 2 3 out="$(cat te ...

  8. shell脚本基本知识点

    Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.用户通过这个界面访问Linux操作系统内核的服务.Shell既是一种命令语言,又是一种程序设计语言. 1.Shell 环境 Shel ...

  9. shell脚本常用命令汇总

    一.shell脚本概述和入门 (1)shell脚本是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核 (2)shell脚本的常用执行方式: 第一种:采用bash或sh+脚本的相对路径或 ...

随机推荐

  1. django 链接地址匹配流程

    前提: 代码结构 步骤一: 下面为某个网页的链接地址 <body> {% if latest_article_list %} <ul> {% for article in la ...

  2. Quality

  3. Java读取文件的时候,如何让指针重新回到文件的开头

    今天在测试IO流的使用的时候发现在reader读取文件之后,再向文件添加内容,再继续读文件,打印出的结果只能读取追加的文件. 如何才能重新读取呢?试了mark和reset,似乎会报异常.记在这以后看是 ...

  4. 51nod 1686 第K大区间2

    1685 第K大区间2 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百科 Input 第一行两个数n和k(1<=n ...

  5. "_OBJC_CLASS_$_ALAssetsLibrary", referenced from:和clang: error: linker command failed with exit code 1 (use -v to see invocation)错误

    在项目中使用MWPhotoBrowser未导入ALAssetsLibrary类库时会导致编译时出现异常: "_OBJC_CLASS_$_ALAssetsLibrary", refe ...

  6. Java 编程规范,常见规范,命名规范,复杂度

    方法/步骤     1. *不允许把多个短语句写在一行中,即一行只写一条语句 1. 示例:如下例子不符合规范. LogFilename now = null;        LogFilename t ...

  7. 配置IIS服务:无法找到该页 您正在搜索的页面可能已经删除、更名或暂时不可用。

    1.配置IIS服务器时,在默认网站创建虚拟目录XXX.然后右击启动页面.aspx,“浏览” 2.  出现错误: 无法找到该页 您正在搜索的页面可能已经删除.更名或暂时不可用. ------------ ...

  8. jdbc 新认识

    以前一直用jdbc,没有深入看看,原来jdbc是java自己的接口规范,db厂商按照接口进行开发对应的驱动,jdbc可以获取db中的元信息,执行sql,获取结果,操作db等等.示例如下. public ...

  9. nodejs利用windows API读取文件属性(dll)

    nodejs调用delphi编写的dll中,使用了dll调用windows api转读取文件属性,感觉使用nodejs也可直接调用windows api. 此处需用到windows系统的version ...

  10. Spring整合JUnit4测试时,使用注解引入多个配置文件

    转自:https://blog.csdn.net/pwh309315228/article/details/62226372 一般情况下: @ContextConfiguration(Location ...