ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

专题 (四) sed

2020-12-21 21:04:21  阅读:163  来源: 互联网

标签:专题 匹配 jar sed 内容 nohup 替换


一、替换

1、简单替换

sed 's/正则表达式/替换后的内容/g'

 “g”:表示全局替换

这个替换之后仅会写入缓存中,并不会持久化保存下来

2、从文件匹配,替换后写入文件

sed -i 's/正则表达式/替换后的内容/g' file

 这个表示从 file 文件中进行匹配和替换

3、复杂匹配替换

sed -i 's#\(target1 \).*\( target2\)#[g]\1替换为新内容\2#' file

 当加上 g 表示 将文件中所有 target1与target2之间的内容替换为 “替换为新的内容”

\(....\)是声明一个要保留的内容, 这里的 \1 对应的就是 就是 第一个 \(....\),\2 对应的就是 就是 第二个 \(....\)

sed -i '/匹配字符串1/s#\(target1 \).*\( target2\)#[g]\1替换为新内容\2#' file

 针对含有 “匹配字符串1” 的行 将  target1与target2之间的内容替换为 “替换为新的内容”  (当然前提时,一行的内容中含有 “匹配字符串1” 及 “target1” "target2")

4、替换的内容为一个 shell 脚本中的变量

sed '/s/匹配内容/'"${replace}"'/'

 要使用 '"${var}"' 才行,否则不生效

5、指定行更改

sed -i '2c 替换内容' file

 将文件中第二行内容 整个替换为 “替换内容”  (整行替换)

sed -i '3s/匹配内容/替换内容/数字' file

 表示将第三行中和 "匹配内容" 匹配到的地方 替换成 “替换内容” ,若数字给值,则表明仅替换匹配上的第几个,没有给值,默认替换匹配上第 “数字”个, 也可以 设置  g  ,表示全部替换。

示例:

1、替换字符串中含有的ip

待补充

2、替换 json 中某个属性的值

文件(test.txt)内容:

{  
  "service":{  
    "id":"service-112",  
    "name":"serviceA",  
    "address":"127.0.0.1",  
    "port":8080,  
    "tags":["contextPath=/"],  
    "checks": [  
        {  
            "http":"127.0.0.1:8080/",  
            "interval":"10s"  
        }  
    ]  
  }  
}  
sed -i 's#\("interval":"\).*\("\)#\120s\2#' test.txt

 执行以上的内容,最后会发现 修改成功;不过以上有一个弊端 ,会进行每行匹配,只要匹配到就进行替换

3、双重匹配替换

文件内容如下:

java -jar xxx.jar &
nohup java -jar xxx.jar &
nohup sh xxx.sh &
java nohup -jar xxx.jar &

sed -i '/nohup/s#\(-jar \).*\(.jar\)#\1yyy\2#' /opt/test.txt

 修改后的文件内容如下:

java -jar xxx.jar & 
nohup java -jar yyy.jar & 
nohup sh xxx.sh & 
java nohup -jar yyy.jar &

 4、目标值为 shell 变量

文件内容如下:

java -jar xxx.jar & 
nohup java -jar xxx.jar & 
nohup sh xxx.sh & 
java nohup -jar xxx.jar & 
replace='kkk'
sed -i '/nohup/s#\(-jar \).*\(.jar\)#\1'"${replace}"'\2#' /opt/test.txt

 修改后的文件内容如下:

java -jar xxx.jar & 
nohup java -jar kkk.jar & 
nohup sh xxx.sh & 
java nohup -jar kkk.jar &

 5、 更改指定行内容

文件内容如下:

test1111
test2222
sed -i '2c testkkkk' /opt/test.txt

 更改后的文件内容如下:

testkkk
test2222

 6、指定行进行匹配,匹配上的话进行替换

文件内容如下:

test1111
test2222
test1111test2222
sed -i '3s/test/temp/2' /opt/test.txt

 更改后的文件内容如下:

testkkk
test2222
test1111temp2222

 二、匹配查询

 (1) 仅展示匹配的内容

sed -n '/正则表达式/p' file

 若没有 -n  ,则会展示所有内容 + 匹配的内容,匹配的内容在文件内容展示完之后显示

示例:

1. 获取含有指定网卡的内容

ifconfig | sed '$!N;/'${local_ip}'/{P;d};D' | awk -F ':' '{print$1}' |sed s/[[:space:]]//g

 2、返回符合条件的上一行

http://www.bathome.net/thread-53545-1-1.html

3、匹配数字(行仅有数字)

文件内容如下:

test2222
test1111temp2222

delete me

when match me then delete me 
12345

 命令:

sed -n '/^[0-9]\+$/p' file

 输出内容:

12345

 三、删除

 (1) 指定行进行删除

sed -i '数字d' file

 表示将 file 中指定 “数字”行给删除掉,并更新到文件中。如果 没有 “-i” ,则表示操作的内容不写入到 file文件中。

(2) 删除匹配的行

sed -i '/匹配内容/d' file

 表示删除含有 “匹配内容的” 行,并生效到文件中

或者使用正则表达式

sed -i '/正则表达式/d' file

 

 示例:

1、删除行首空格

sed ‘s/^[ \t]*//g'

说明:

第一个/的左边是s表示替换,即将空格替换为空。
第一个/的右边是表示后面的以xx开头。
中括号表示“或”,空格或tab中的任意一种。这是正则表达式的规范。
中括号右边是*,表示一个或多个。

第二个和第三个\中间没有东西,表示空

g表示替换原来buffer(缓冲区)中的,sed在处理字符串的时候并不对源文件进行直接处理,先创建一个buffer,但是加g表示对原buffer进行替换

整体的意思是:用空字符去替换一个或多个用空格或tab开头的本体字符串

2、删除行末空格

sed ‘s/[ \t]*$//g'

和上面稍微有些不同是前面删除了^符,在后面加上了美元符,这表示以xx结尾的字符串为对象。

但是要注意在KSH中,Tab并不是\t而是直接打入一个Tab就可以了。

3、删除所有的空格

sed s/[[:space:]]//g

4、删除指定行的内容

文件内容如下:

delete me

 命令:

sed -i '1d' /opt/test.txt

 更新后的文件内容:

文件为空的

5、删除匹配内容的行

原有文件内容:

when match me then delete me 

 命令:

sed -i '/match/d' /opt/test.txt

更新后的文件内容:

文件为空的

四、增加 

 

 

 

 

 

 

 

 

参考资料:

https://www.jb51.net/article/57972.htm

https://blog.csdn.net/wdz306ling/article/details/80087889   (推荐,这里面的内容还是蛮全的)

标签:专题,匹配,jar,sed,内容,nohup,替换
来源: https://www.cnblogs.com/sandyflower/p/14030827.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有