windows ubuntu sed,awk,grep篇:2:sed 替换命令

news/2024/5/12 13:24:32

目录

6.sed 替换命令语法

7.全局标志 g

8.数字标志(1,2,3 ….)

9.打印标志 p(print)

10.写标志 w

11.忽略大小写标志 i (ignore)

12.执行命令标志 e (excuate)

13.使用替换标志组合

14.sed 替换命令分界符

15.单行内容上执行多个命令

16.&的作用——获取匹配到的模式

17.分组替换(单个分组)

18.分组替换(多个分组)

19.GNU Sed 专有的替换标志


流编辑器中最强大的功能就是替换(substitute),其强大的功能和繁多的选项将占据下面整整
一章的内容。

6.sed 替换命令语法

sed ‘[address-range|pattern-range] s/original-string/replacement-string/[substitute-flags]’
input file
上面提到的语法为:
address-range pattern-range( 即地址范围和模式范围 ) 是可选的。如果没有指
定,那么 sed 将在所有行上进行替换。
s 即执行替换命令 substitute
original-string 是被 sed 搜索然后被替换的字符串,它可以是一个正则表达式
replacement-string 替换后的字符串
substitute-flags 是可选的,下面会具体解释
请谨记原始输入文件不会被修改, sed 只在模式空间中执行替换命令,然后输出模式空间的
内容。
下面是一些简单的替换示例(替换的部分用黑体标明)
Director 替换所有行中的 Manager:
$ sed 's/Manager/Director/' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Director
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Director
只把包含 Sales 的行中的 Manager 替换为 Director:
$ sed '/Sales/s/Manager/Director/' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Director
注意:本例由于使用了地址范围限制,所以只有一个 Manager 被替换了

7.全局标志 g

        g 代表全局 (global) 默认情况下, sed 至会替换每行中第一次出现的 original-string 。如果你要
替换每行中出现的所有 original-string, 就需要使用 g
用大写 A 替换第一次出现的小写字母 a
$ sed 's/a/A/' employee.txt
101,John Doe,CEO
102,J A son Smith,IT Manager
103,R A j Reddy,Sysadmin
104,An A nd Ram,Developer
105,J A ne Miller,Sales Manager
把所有小写字母 a 替换为大写字母 A
$ sed 's/a/A/g' employee.txt
101,John Doe,CEO
102,J A son Smith,IT M A nAger
103,R A j Reddy,Sys A dmin
104,An A nd R A m,Developer
105,J A ne Miller,S A les M A n A ger
注意:上述例子会在所有行上替换,因为没有指定地址范围。

8.数字标志(1,2,3 ….)

使用数字可以指定 original-string 出现的次序。只有第 n 次出现的 original-string 才会触发替
换。每行的数字从 1 开始,最大为 512
比如 /11 会替换每行中第 11 次出现的 original-string
下面是几个例子:
把第二次出现的小写字母 a 替换为大写字母 A
$ sed 's/a/A/2' employee.txt
101,John Doe,CEO
102,Jason Smith,IT M A nager
103,Raj Reddy,Sys A dmin 104,Anand R A m,Developer
105,Jane Miller,S A les Manager
为了方面下面示例,请先建立如下文件:
$ vim substitute-locate.txt
locate command is used to locate files
locate command uses database to locate files
locate command can also use regex for searching
使用刚才建立的文件,把每行中第二次出现的 locate 替换为 find:
$ sed 's/locate/find/2' substitute-locate.txt
locate command is used to find files
locate command uses database to find files
locate command can also use regex for searching
注意:第 3 行中 locate 只出现了一次,所以没有替换任何内容

9.打印标志 p(print)

命令 p 代表 print 。当替换操作完成后,打印替换后的行。与其他打印命令类似, sed 中比较
有用的方法是和 -n 一起使用以抑制默认的打印操作。
只打印替换后的行:
$ sed -n 's/John/Johnny/p' employee.txt
101, Johnny Doe,CEO
在之前的数字标志的例子中,使用 /2 来替换第二次出现的 locate 。第 3 行中 locate 只出现了
一次,所以没有替换任何内容。使用 p 标志可以只打印替换过的两行。
把每行中第二次出现的 locate 替换为 find 并打印出来:
$ sed -n 's/locate/find/2p' substitute-locate.txt
locate command is used to find files
locate command uses database to find files

10.写标志 w

标志 w 代表 write 。当替换操作执行成功后,它把替换后的结果保存的文件中。多数人更倾
向于使用 p 打印内容,然后重定向到文件中。为了对 sed 标志有个完整的᧿述,在这里把这
个标志也提出来了。
只把替换后的内容写到 output.txt :
$ sed -n 's/John/Johnny/w output.txt' employee.txt
$ cat output.txt
101,Johnny Doe,CEO
和之前使用的命令 p 一样,使用 w 会把替换后的内容保存到文件 output.txt 中。
把每行第二次出现的 locate 替换为 find,把替换的结果保存到文件中,同时显示输入文件所
有内容:
$ sed 's/locate/find/2w output.txt' substitute-locate.txt
locate command is used to find files
locate command uses database to find files
locate command can also use regex for searching
$ cat output.txt
locate command is used to find files
locate command uses database to find files

11.忽略大小写标志 i (ignore)

        替换标志 i 代表忽略大小写。可以使用 i 来以小写字符的模式匹配 original-string 。该标志只
GNU Sed 中才可使用。
下面的例子不会把 John 替换为 Johnny,因为 original-string 字符串是小写形式:
$ sed 's/john/Johnny/' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
john John 替换为 Johnny:
$ sed 's/john/Johnny/i' employee.txt
101, Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

12.执行命令标志 e (excuate)

        替换标志 e 代表执行 (execute) 。该标志可以将模式空间中的任何内容当做 shell 命令执行,
并把命令执行的结果返回到模式空间。该标志只有 GNU Sed 中才可使用。
下面是几个例子:
为了下面的例子,请先建立如下文件:
$ cat files.txt
/etc/passwd
/etc/group

files.txt 文件中的每行前面添加 ls –l 并打击结果:

$ sed 's/^/ls -l/' files.txt

ls -l/etc/passwd
ls -l/etc/group
files.txt 文件中的每行前面添加 ls –l 并把结果作为命令执行:
$ sed 's/^/ls -l /e' files.txt
-rw-r--r-- 1 root root 1533 Dec 13 20:21 /etc/passwd
-rw-r--r-- 1 root root 682 Dec 13 20:21 /etc/group

13.使用替换标志组合

根据需要可以把一个或多个替换标志组合起来使用。
下面的例子将把每行中出现的所有 Manager manager 替换为 Director 。然后把替换后的内
容打印到屏幕上,同时把这些内容保存到 output.txt 文件中。
使用 g,I,p w 的组合:
$ sed -n 's/manager/Director/igpw output.txt' employee.txt
102,Jason Smith,IT Director
105,Jane Miller,Sales Director
$ cat output.txt
102,Jason Smith,IT Director
105,Jane Miller,Sales Director

14.sed 替换命令分界符

上面所有例子中,我们都是用了 sed 默认的分界符 /, s/original-string/replacement-string/g 如果在 original-string replacement-string 中有 /, 那么需要使用反斜杠 \ 来转义。
为了便于示 例,请先建立下面文件:
$ vi path.txt
$ cat path.txt
reading /usr/local/bin directory
限制使用 sed /usr/local/bin 替换为/usr/bin。在下面例子中,sed 默认的分界符/都被\转义 了:
$ sed 's/\/usr\/local\/bin/\/usr\/bin/' path.txt
reading /usr/bin directory
很难看,不是吗?如果要替换一个很长的路径,每个 / 前面都使用 \ 转义,会显得很混乱。幸
运的是,你可以使用任何一个字符作为 sed 替换命令的分界符,如 | ^ @ 或者 !
下面的所有例子都比较易读。这里不再显示下面例子的结果,因为它们的结果和上面的例子
是相同的。我个人比较倾向于使用@或者!来替换路径,但使用什么看你自己的偏好了。
sed ‘s|/usr/local/bin|/usr/bin|’ path.txt
sed ‘s^/usr/local/bin^/usr/bin^’ path.txt
sed ‘s@/usr/local/bin@/usr/bin@’ path.txt
sed ‘s!/usr/local/bin!/usr/bin!’ path.txt

15.单行内容上执行多个命令

        一如之前所说,sed 执行的过程是读取内容、执行命令、打印结果、重复循环。其中执行命
令部分,可以由多个命令执行, sed 将一个一个地依次执行它们。
例如,你有两个命令, sed 将在模式空间中执行第一个命令,然后执行第二个命令。如果第
一个命令改变了模式空间的内容,第二个命令会在改变后的模式空间上执行 ( 此时模式空间
的内容已经不是最开始读取进来的内容了 )
下面的例子演示了在模式空间内执行两个替换命令的过程:
Developer 替换为 IT Manager, 然后把 Manager 替换为 Director:
$ sed '{
> s/Developer/IT Manager/
> s/Manager/Director/
> }' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Director
103,Raj Reddy,Sysadmin
104,Anand Ram, IT Director
105,Jane Miller,Sales Director
我们来分析下第 4 行的执行过程:
1. 读取数据 :在这一步, sed 读取内容到模式空间,此时模式空间的内容为:
104,Anand Ram,Developer
2. 执行命令: 第一个命令, s/Developer/IT Manager/ 执行后,模式空间的内容为 :
104,Anand Ram,IT Manager
现在在模式空间上执行第二个命令 s/Manager/Director/, 执行后,模式空间内容为 :
104,Anand Ram,IT Director
谨记: sed 在第一个命令执行的结果上,执行第二个命令。
3. 打印内容 : 打印当前模式空间的内容,如下 :
104,Anand Ram,IT Director
4. 重复循环: 移动的输入文件的下一行,然后重复执行第一步,即读取数据

16.&的作用——获取匹配到的模式

当在 replacement-string 中使用 & 时,它会被替换成匹配到的 original-string 或正则表达式,这
是个很有用的东西。
看下面示例:
给雇员 ID(即第一列的 3 个数字)加上[ ],101 改成[101]
$ sed 's/^[0-9][0-9][0-9]/[&]/g' employee.txt
[101],John Doe,CEO
[102],Jason Smith,IT Manager
[103],Raj Reddy,Sysadmin
[104],Anand Ram,Developer
[105],Jane Miller,Sales Manager
把每一行放进< >中:
$ sed 's/^.*/<&>/' employee.txt
<101,John Doe,CEO>
<102,Jason Smith,IT Manager>
<103,Raj Reddy,Sysadmin>
<104,Anand Ram,Developer>
<105,Jane Miller,Sales Manager>

17.分组替换(单个分组)

跟在正则表达式中一样, sed 中也可以使用分组。分组以 \( 开始,以 \) 结束。分组可以用在
回溯引用中。
回溯引用即重新使用分组所选择的部分正则表达式,在 sed 替换命令的 replacement-string 中和正则表达式中,都可以使用回溯引用。
单个分组:
$ sed 's/\([^,]*\).*/\1/g' employee.txt
101
102
103
104
105
上面例子中:
z 正则表达式 \([^,]*\) 匹配字符串从开头到第一个逗号之间的所有字符 ( 并将其放入第
一个分组中 )
z replacement-string 中的 \1 将替代匹配到的分组
z g 即是全局标志
下面这个例子只会显示/etc/passwd 的第一列,即用户名:
$ sed 's/\([^:]*\).*/\1/' /etc/passwd
下面的例子,如果单词第一个字符为大写,那么会给这个大写字符加上()
$ echo "The Geek Stuff"|sed 's/\(\b[A-Z]\)/\(\1\)/g'
(T)he (G)eek (S)tuff
请先建立下面文件,以便下面的示例使用:
$ vim numbers.txt
1
12
123
1234
12345
123456
格式化数字,增加其可读性 :
$ sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers.txt
1
12
123
1,234
12,345
123,456

18.分组替换(多个分组)

你可以使用多个 \( \) 划分多个分组,使用多个分组时,需要在 replacement-string 中使用 \n
来指定第 n 个分组。如下面的示例。
只打印第一列(雇员 ID)和第三列(雇员职位):
$ sed 's/^\([^,]*\),\([^,]*\),\([^,]*\)/\1,\3/' employee.txt
101,CEO
102,IT Manager
103,Sysadmin
104,Developer
105,Sales Manager
在这个例子中,可以看到, original-string 中,划分了 3 个分组,以逗号分隔。
z ([^,]*\) 第一个分组,匹配雇员 ID
z ,为字段分隔符
z ([^,]*\) 第二个分组,匹配雇员姓名
z ,为字段分隔符
z ([^,]*\) 第三个分组,匹配雇员职位
z ,为字段分隔符,上面的例子演示了如何使用分组
z \1 代表第一个分组 ( 雇员 ID)
z ,出现在第一个分组之后的逗号
z \3 代表第二个分组 ( 雇员职位 )
注意: sed 最多能处理 9 个分组,分别用 \1 \9 表示。 交换第一列 ( 雇员 ID) 和第二列 ( 雇员姓名 )
$ sed 's/^\([^,]*\),\([^,]*\),\([^,]*\)/\2,\1,\3/' employee.txt
John Doe,101,CEO
Jason Smith,102,IT Manager
Raj Reddy,103,Sysadmin
Anand Ram,104,Developer
Jane Miller,105,Sales Manager

19.GNU Sed 专有的替换标志

下面的标志,只有 GNU 版的 sed 才能使用。它们可以用在替换命令中的 replacement-string
里面 .
\l 标志 当在 replacement-string 中使用 \l 标志时,它会把紧跟在其后面的字符当做小写字符来处理。
如你所知,下面的例子将把 John 换成 JOHNNY:
sed ‘s/John/JOHNNY/’ employee.txt
下面的例子,在 replacement-string 中的 H 前面放置了\l 标志,它会把 JOHNNY 中的 H 换成
小写的 h:
$ sed -n 's/John/JO\lHNNY/p' employee.txt
101,JO h NNY Doe,CEO
\L 标志 当在 replacement-string 中使用 \l 标志时,它会把后面所有的字符都当做小写字符来处理。
下面的例子,在 replacement-string 中的 H 前面放置了\L 标志,它会把 H 和它后面的所有字符
都换成小写:
$ sed -n 's/John/JO\LHNNY/p' employee.txt
101,JO hnny Doe,CEO
\u 标志 和\l 类似,只不过是把字符换成大写。当在 replacement-string 中使用 \u 标志时,它会把紧 跟在其后面的字符当做大写字符来处理。
下面的例子中,replacement-string 里面的 h 前面有 \u 标志,所以 h 将被换成大写的 H:
$ sed -n 's/John/jo\uhnny/p' employee.txt
101,jo H nny Doe,CEO
\U 标志 当在 replacement-string 中使用 \U 标志时,它会把后面所有的字符都当做大写字符来处理。
下面的例子中,replacement-string 里面的 h 前面有\U 标志,所以 h 及其以后的所有字符,
都将被换成大写:
$ sed -n 's/John/jo\Uhnny/p' employee.txt
101,jo HNNY Doe,CEO \E 标志
\E 标志需要和\U \L 一起使用,它将关闭\U \L 的功能。
下面的例子将把字符串”Johnny Boy” 的每个字符都以大写的形式打印出来,因为在 replacement-string 前面使用了\U 标志:
$ sed -n 's/John/\UJohnny Boy/p' employee.txt
101, JOHNNY BOY Doe,CEO
下面将把 John 换成 JOHNNY Boy:
$ sed -n 's/John/\UJohnny\E Boy/p' employee.txt
101, JOHNNY Boy Doe,CEO
这个例子只把 Johnny 显示为大写,因为在 Johnny 后面使用了 \E 标志 ( 关闭了 \U 的功能 )
替换标志的用法
上面的例子仅仅展示了这些标志的用法和功能。然而,如果你使用的是具体的字符串,那么
这些选项未必有什么作用,因为你可以在需要的地方写出精确的字符串,而不需要使用这些
标志进行转换。
和分组配合使用时,这些选项就显得很有用了。前面例子中我们已经学会了如何使用分组调
换第一列和第三列的位置。使用上述标志,可以把整个分组转换为小写或大写。
下面的例子,雇员 ID 都显示为大写,职位都显示为小写:
$ sed 's/\([^,]*\),\([^,]*\),\([^,]*\)/\U\2\E,\1,\L\3/' employee.txt
JOHN DOE,101,ceo
JASON SMITH,102,it manager
RAJ REDDY,103,sysadmin
ANAND RAM,104,developer
JANE MILLER,105,sales manager
这个例子中:
z \U\2\E 把第二个分组转换为大写,然后用 \E 关闭转换
z \L\3 把第三个分组转换为小写

资料来源于《SedandAwk101Hacks》,大家有兴趣可以买一本,也可以关注我,我更新完它。

曾经,我花费大半月将它们跑完,现在啥都忘了,还是要常用。

本文只交流学习,不为获利,侵权联系立删。


http://www.mrgr.cn/p/18518708

相关文章

开源相机管理库Aravis例程学习(五)——camera-api

本文针对Aravis官方例程中的:03-camera-api做简单的讲解目录简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的:03-camera-api做简单的讲解。并介绍其中…

Java基础_集合类_List

List Collection、List接口1、继承结构2、方法 Collection实现类1、继承结构2、相关类&#xff08;1&#xff09;AbstractCollection&#xff08;2&#xff09;AbstractListAbstractSequentialList&#xff08;子类&#xff09; 其它接口RandomAccess【java.util】Cloneable【j…

MySQL三大日志(binlog,redolog,undolog)详解

转发https://segmentfault.com/a/1190000041758784 一、MySQL日志 MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是二进制日志binlog(归档日志)、事务日志redo log(重做日志)和undo log(回滚日志)。 日志关系如下图:…

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽&#xff0c;大致可以分为两大类&#x…

macOS打开程序提示文件已损坏

macOS打开程序提示文件已损坏解决方案 因为macOS有一个校验机制,如果打开程序提示文件已损坏,你需要使用终端,输入codesign --force --deep --sign - "这里拖入程序" 如果遇到macOS已阻止XXXX程序打开,因为它来自未经验证的开发者,你需要进入设置,安全性和隐私…

QAnything 与 OpenCloudOS 联合打造操作系统 AI 问答解决方案

由网易有道开源的AI知识库问答平台QAnything 1.4.0版本正式发布,并集成到OpenCloudOS操作系统中,为OpenCloudOS用户提供了一键部署AI知识问答库的能力。导语:4 月 26 日,由网易有道开源的 AI 知识库问答平台 QAnything 发布 1.4.0 版本,并集成到 OpenCloudOS 操作系统中,…

揭示C++设计模式中的实现结构及应用——行为型设计模式

简介 行为型模式&#xff08;Behavioral Pattern&#xff09;是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构&#xff0c;而且重点关注它们之间的相互作用。 通过行为型模式&#xff0c;可以更加清晰地划分类与对象的职责&#xff0c;并…

揭秘JavaScript数据世界:一文通晓基本类型和引用类型的精髓!

在编程的世界里,数据是构建一切的基础。就像建筑师需要了解不同材料的强度和特性一样,程序员也必须熟悉各种数据类型。 今天,我们就来深入探讨JavaScript中的数据类型,看看它们如何塑造我们的代码世界。 一、JavaScript数据类型简介 数据类型是计算机语言的基础知识,数据类…

实时通讯技术 WebRTC 介绍

WebRTC WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音对话或视频对话的技术。 历史 2010年5月&#xff0c;Google以6820万美元收购VoIP软件开发商Global IP Solutions的GIPS引擎&#xff0c;并改为名为“WebRTC”。WebRTC使用…

MUR1060D-ASEMI开关电源专用MUR1060D

MUR1060D-ASEMI开关电源专用MUR1060D编辑:ll MUR1060D-ASEMI开关电源专用MUR1060D 型号:MUR1060D 品牌:ASEMI 封装:TO-252 正向电流(IF):10A 反向电压(VRRM):600V 正向电压(VF):1.30V 工作温度:-55C~150C 恢复时间:35ns 芯片个数:1 引脚数量:4 芯片尺寸:86mi…

冰箱主控 32位MCU,多通道、高精度的AD采样配合温度传感器,实现冰箱各温室的精确控温;低功耗设计

概览 小华高性价比32位MCU&#xff0c;多通道、高精度的AD采样配合温度传感器&#xff0c;实现冰箱各温室的精确控温&#xff1b;低功耗设计&#xff0c;绿色低碳、节能环保&#xff1b;模块化设计&#xff0c;充分利用丰富的通讯接口&#xff0c;使主控板、显示板和驱动板灵活…

HNU-数据库系统-甘晴void学习感悟

前言 过程坎坷&#xff0c;终局满意。 感觉是学懂了知识&#xff0c;并且拿到了分数这样的学科。 【先把这个位置占下来&#xff0c;之后有时间再补充】 教材如下&#xff1a; 总领 有点忘记了&#xff0c;可参考当时记录的笔记&#xff1a; 数据库系统-甘晴void学习笔记-…

五•一颂|广州流辰信息致敬每一个辛勤的劳动者,祝大家五一快乐!

正值五一国际劳动节来临之际,广州流辰信息感恩这个伟大的时代,致敬每一个辛勤劳动的劳动者们,并向大家致以节日的问候与祝福,祝大家:阖家团圆、幸福安康、节日快乐!时光飞逝,一年一度的五一国际劳动节如期而至。在这个竞争激烈的社会中,拥有勤劳品质的人儿总会在适当的…

系统目录结构

名称 详情/bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令/boot 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件/dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的…

统计建模——模型——python为例

统计建模涵盖了众多数学模型和分析方法&#xff0c;这些模型和方法被广泛应用于数据分析、预测、推断、分类、聚类等任务中。下面列举了一些常见的统计建模方法及其具体应用方式&#xff1a; 目录 1.线性回归模型&#xff1a; ----python实现线性回归模型 -------使用NumPy…

企业架构管控的探索与实践

当前,传统的组织结构和信息系统已经难以满足企业的发展需求,众多企业面临着数字化转型战略落地难、信息孤岛、系统集成度低和互操作性低等问题,导致业务流程不畅、资源浪费和效率低下。 为此,企业需要一种能够全面描述和分析现状,并能对企业做出合理诊断和规划的方法。企业…

学习笔记448—“消失”5个月后,她回来了!

消失了5个月后,张雪终于有消息了, 去了广发基金。 昨天,广发基金官宣了这一消息。在广发基金,张雪管的是“广发价值回报”, 目前就管了这一只基金,昨天(3月15日)才开始管。 这只基金规模不大,A类、C类份额加在一起也就2.08亿元,约等于张雪离任前管理规模的1%。 不过以…

Go-Zero微服务快速入门和最佳实践(一)

前言 并发编程和分布式微服务是我们Gopher升职加薪的关键。 毕竟Go基础很容易搞定,不管你是否有编程经验,都可以比较快速的入门Go语言进行简单项目的开发。 虽说好上手,但是想和别人拉开差距,提高自己的竞争力,搞懂分布式微服务和并发编程还是灰常重要的,这也是我今年更新…

一款小巧精美的浏览器必备工具(支持Chrome,Edge)

一键清洁大师:专业的浏览器数据清理工具;超美动画,炫酷特效,让清理垃圾数据变得更有趣;一键清理多种缓存、历史记录、下载内容、表单、Cookies、密码、本地存储、本地数据库等。下载地址: https://chromewebstore.google.com/detail/%E4%B8%80%E9%94%AE%E6%B8%85%E6%B4%8…

Codeforces Round 941 (Div. 2) (A~D)

Codeforces Round 941 (Div. 2) (A~D) 本题解思路是个人的和官方题解思路差别可能较大&#xff0c;仅供参考 目录&#xff1a;A B C D A题&#xff1a;Card Exchange 标签: 贪心策略&#xff08;greedy&#xff09; 题目大意 给 n 张牌&#xff0c;每张牌上都写着一个数字&…