【第九章】vim程序编辑器

news2024/9/20 9:20:38

文章目录

  • vi与vim
  • vi的使用
    • 范例
    • 按键说明
      • 一般指令模式可用的按钮说明:光标移动、复制贴上、搜寻取代等
      • 一般指令模式切换到编辑模式的可用的按钮说明
      • 一般指令模式切换到命令行界面的可用按钮说明
    • vim的暂存盘、救援回复与打开时的警告讯息
  • vim的额外功能
    • 区块选择(Visual Block)
    • 多档案编辑
  • 其他vim使用注意事项
    • 中文编码的问题
    • DOS与Linux的断行字符
    • 语系编码转换

vi与vim

一、Linux上面的指令都默认使用vi作为数据编辑的接口,所以一定要学会vi
二、vim是vi的进阶版本,vim可以用颜色或底线等方式来显示一些特殊的信息,vi是老式的文书处理器。vim是个“程序编辑器”,具有颜色显示的功能,并且还支持许多的程序语法(syntax),当你使用vim编辑程序时(不论是C语言,还是shell script),vim可帮你直接进行“程序除错(debug)”

vi的使用

一、vi分为三种模式:一般指令模式、编辑模式、命令行命令模式

  1. 一般指令模式 (command mode):以vi打开一个文件就直接进入一般指令模式了(这是默认模式,也简称为一般模式)。在这个模式中, 你可以使用“上下左右”按键来移动光标,你可以使用“删除字符”或“删除整列”来处理文件内容, 也可以使用“复制、贴上”来处理你的文件数据。
  2. 编辑模式 (insert mode):在一般指令模式中无法编辑文件内容,按下“i, I, o, O, a, A, r, R”等任何一个字母之后才会进入编辑模式。通常在Linux中,按下这些按键时,在画面的左下方会出现“INSERT或REPLACE”字样,此时才可以进行编辑。而如果要回到一般指令模式时, 则必须要按下“Esc”这个按键即可退出编辑模式。
  3. 命令行命令模式(command-line mode):在一般模式当中,输入“: / ?”三个中的任何一个按钮,就可以将光标移动到最下面那一列。在这个模式当中, 可以执行“搜寻数据”的动作,而读取、存盘、大量取代字符、离开vi、显示行号等等的动作则是在此模式中达成的!
    在这里插入图片描述

范例

使用vi来创建一个名为welcome.txt的文件:

  1. 使用vi filename进入一般指令模式:
[dmtsai@study ~]$ /bin/vi welcome.txt
# 在CentOS7中,由于一般帐号默认vi已经被vim取代了,因此要输入绝对路径来执行才行!

整个画面主要分为两部份,上半部与最底下一行两者可以视为独立的,图中那个虚线是不存在的,本文用来说明而已啦!上半部显示的是档案的实际内容,最底下一行则是状态显示列(如下图的[New File]信息),或者是命令下达列:
在这里插入图片描述
如果你开启的档案是旧档(已经存在的档案),则可能会出现如下的信息:
在这里插入图片描述
箭头所指的那个/etc/man.config" 141L, 4617C代表的是『档名为/etc/man.conf,档案内有141行以及具有4617个字符』的意思! 那一行的内容并不是在档案内,而是在vi显示一些信息的地方喔!

  1. 按下i进入编辑模式,开始编辑文字
    在这里插入图片描述注意:在vi里面,[tab]这个按钮所得到的结果与空格符所得到的结果不一样
  2. 按下[ESC] 按钮回到一般指令模式
  3. 进入命令行界面,文件储存并离开vi环境:输入:wq即可存盘离开!

注意:

  1. 按下:光标就会移动到最下面一行去!
  2. 存盘(write)并离开(quit)

在提示字符后面输入ls -l就可以看到我们刚刚创建的welcome.txt文件啦!整个图示有点像下面这样:
在这里插入图片描述
如果你的文件权限不对,例如为-r--r--r--时,那么可能无法写入,此时可以使用强制写入的方式,即使用:wq!(多加一个惊叹号即可!)不过,这是在你的权限可以改变的情况下才能成立的!

按键说明

一般指令模式可用的按钮说明:光标移动、复制贴上、搜寻取代等

一、光标移动

移动光标的方法
h 或 向左方向键(←)光标向左移动一个字符
j 或 向下方向键(↓)光标向下移动一个字符
k 或 向上方向键(↑)光标向上移动一个字符
l 或 向右方向键(→)光标向右移动一个字符
l 或 向右方向键(→)光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现hjkl是排列在一起的,因此可以使用这四个按钮来移动光标。如果想要进行多次移动的话,例如向下移动30列,可以使用30j30↓的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
[Ctrl] + [f]屏幕“向下”移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b]屏幕“向上”移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d]屏幕“向下”移动半页
[Ctrl] + [u]屏幕“向上”移动半页
+光标移动到非空白字符的下一列
-光标移动到非空白字符的上一列
n<space>那个 n 表示“数字”,例如20。按下数字后再按空白键,光标会向右移动这一列的n个字符。例如20<space>则光标会向后面移动20个字符距离。
0或功能键[Home]移动到这一行的最前面字符处(常用)
$或功能键[End]移动到这一行的最后面字符处(常用)
H光标移动到这个屏幕的最上方那一行的第一个字符
M光标移动到这个屏幕的中央那一行的第一个字符
L光标移动到这个屏幕的最下方那一行的第一个字符
G移动到这个文件的最后一行(常用)
nGn为数字。移动到这个文件的第n行。例如20G则会移动到这个文件的第20行(可配合:set nu
gg移动到这个文件的第一行,相当于1G啊!(常用)
n<Enter>n为数字。光标向下移动n行(常用)

二、搜寻与取代

方法含义
/word向光标之下寻找一个名称为word的字串
?word向光标之上寻找一个字串名称为word的字串
n这个n是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行/vbird去向下搜寻vbird这个字串,则按下n后,会向下继续搜寻下一个名称为vbird的字串。如果是执行?vbird的话,那么按下n则会向上继续搜寻名称为vbird的字串!
N这个N是英文按键。与n刚好相反,为“反向”进行前一个搜寻动作。例如/vbird后,按下N则表示“向上”搜寻vbird 。
:n1,n2s/word1/word2/gn1与n2为数字。在第n1与n2行之间寻找word1这个字串,并将该字串取代为word2,举例来说,在100到200行之间搜寻vbird并取代为VBIRD则::100,200s/vbird/VBIRD/g(常用)
:1,$s/word1/word2/g从第一行到最后一行寻找word1字串,并将该字串取代为word2!(常用)
:1,$s/word1/word2/gc从第一行到最后一行寻找word1字串,并将该字串取代为word2!且在取代前显示提示字符给使用者确认(confirm) 是否需要取代!(常用)

三、删除、复制与贴上

方法含义
x, Xx为向后删除一个字符(相当于[del]按键),X为向前删除一个字符(相当于[backspace]亦即是倒退键) (常用)
nxn为数字,连续向后删除n个字符。举例来说,我要连续删除10个字符:10x
dd删除光标所在的那一整列(常用)
nddn为数字。删除光标所在的向下n行,例如20dd则是删除20行(常用)
d1G删除光标所在到第一行的所有数据
dG删除光标所在到最后一行的所有数据
d$删除光标所在处,到该行的最后一个字符
d0删除光标所在处,到该行的最前面一个字符
yy复制光标所在的那一行(常用)
nyyn 为数字。复制光标所在的向下n行,例如20yy则是复制20行(常用)
y1G复制光标所在行到第一行的所有数据
yG复制光标所在列到最后一列的所有数据
y0复制光标所在的那个字符到该行行首的所有数据
y$复制光标所在的那个字符到该行行尾的所有数据
p, Pp为将已复制的数据在光标下一行贴上,P则为贴在光标上一列!举例来说,我目前光标在第20行,且已经复制了10行数据。则按下p后,那10行数据会贴在原本的20行之后,亦即由21行开始贴。但如果是按下P呢?那么原本的第20行会被推到变成30行。(常用)
J将光标所在行与下一行的数据结合成同一行
c重复删除多个数据,例如向下删除10列:[10cj]
u复原前一个动作。(常用)
[Ctrl]+r重做上一个动作。(常用)
.重复前一个动作。如果你想要重复删除、重复贴上等等动作,按下小数点.就好了!(常用)

一般指令模式切换到编辑模式的可用的按钮说明

进入插入或取代的编辑模式
i, I进入插入模式(Insert mode):i为从目前光标所在处插入,I为在目前所在行的第一个非空白字符处开始插入。(常用)
a, A进入插入模式(Insert mode):a为从目前光标所在的下一个字符处开始插入,A 为从光标所在列的最后一个字符处开始插入。(常用)
r, R进入取代模式(Replace mode):r只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下ESC为止;(常用)
[Esc]退出编辑模式,回到一般指令模式中(常用)

上面除最后一个[Esc]按键外,在vi画面的左下角处会出现--INSERT----REPLACE--的字样。你想要在文件里面输入字符时,一定要在左下角处看到 INSERTREPLACE才能输入喔!

一般指令模式切换到命令行界面的可用按钮说明

命令行界面的储存、离开等指令
:w将编辑的数据写入硬盘文件中(常用)
:w!若文件属性为只读时,强制写入该文件。不过到底能不能写入,还是跟你对该文件的文件权限有关啊!
:q离开vi(常用)
:q!若曾修改过文件,又不想储存,使用!为强制离开不储存盘案。
注意:惊叹号 (!) 在vi当中,常常具有强制的意思
:wq储存后离开,若为:wq!则为强制储存后离开(常用)
ZZ若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开!
:w [filename]将编辑的数据储存成另一个文件(类似另存新文件)
:r [filename]在编辑的数据中,读入另一个文件的数据。亦即将filename这个文件内容加到光标所在行后面
:n1,n2 w [filename]将n1到n2的内容储存成filename这个文件。
:! command暂时离开vi到命令行界面下执行command的显示结果!例如:! ls /home表示可在vi当中察看/home下面以ls输出的文件信息!
vim环境的变更
:set nu显示行号,设置之后,会在每一列的字首显示该行的行号
:set nonu与set nu相反,为取消行号!

在vi中,数字通常代表重复做几次,或去到第几个什么什么的意思。举例来说,要删除50行,则是用50dd,数字加在动作之前~要向下移动20行就是20j或者是20↓

vim的暂存盘、救援回复与打开时的警告讯息

一、回复:当你的系统因为某些原因而导致类似死机的情况时,还可以通过某些特别的机制来让你将之前未储存的数据“救”回来!
二、当我们在使用vim编辑时,vim会在与被编辑的文件的目录下,再创建一个名为.filename.swp的文件。比如说我们在上一个小节谈到的编辑 /tmp/vitest/man_db.conf这个文件时,vim会主动的创建 /tmp/vitest/.man_db.conf.swp的暂存盘,你对man_db.conf做的动作就会被记录到这个.man_db.conf.swp当中喔!如果你的系统因为某些原因断线了,导致你编辑的文件还没有储存,这个时候.man_db.conf.swp就能够发挥救援的功能了!
三、如果在多人共同编辑的情况下, 万一大家同时储存,那么这个文件的内容将会变的乱七八糟!为了避免这个问题,因此vim会出现警告窗口! 解决的方法则是:

  1. 找到另外那个程序或人员,请他将该vim的工作结束,然后你再继续处理。
  2. 如果你只是要看该文件的内容并不会有任何修改编辑的行为,那么可以选择打开成为只读(O)文件, 亦即上述画面反白部分输入英文o即可,其实就是 [O]pen Read-Only的选项啦!

四、在前一个vim的环境中,可能因为某些不知名原因导致vim中断(crashed):这就是常见的不正常结束vim产生的后果。常见的处理方法为:

  1. 如果你之前的vim处理动作尚未储存,此时你应该要按下R,亦即使用(R)ecover的项目, 此时vim会载入.man_db.conf.swp的内容,让你自己来决定要不要储存!这样就能够救回来你之前未储存的工作。不过那个.man_db.conf.swp并不会在你结束vim后自动删除,所以你离开vim后还得要自行删除.man_db.conf.swp才能避免每次打开这个文件都会出现这样的警告!
  2. 如果你确定这个暂存盘是没有用的,那么你可以直接按下D删除掉这个暂存盘,亦即(D)elete这个项目即可。此时vim会载入man_db.conf,并且将旧的.man_db.conf.swp删除后,创建这次会使用的新的.man_db.conf.swp喔!

五、在发现暂存盘警告讯息的画面中,有出现六个可用按钮:

  1. [O]pen Read-Only:打开此文件成为只读文件, 可以用在你只是想要查阅该文件内容并不想要进行编辑行为时。
  2. (E)dit anyway:还是用正常的方式打开你要编辑的那个文件, 并不会载入暂存盘的内容。不过很容易出现两个使用者互相改变对方的文件等问题!不好不好!
  3. (R)ecover:就是载入暂存盘的内容,用在你要救回之前未储存的工作。不过当你救回来并且储存离开vim后,还是要手动自行删除那个暂存盘喔!
  4. (D)elete it:你确定那个暂存盘是无用的!那么打开文件前会先将这个暂存盘删除!常用
  5. (Q)uit:按下q就离开vim,不会进行任何动作回到命令提示字符。
  6. (A)bort:忽略这个编辑行为,感觉上与quit非常类似!会送你回到命令提示字符

vim的额外功能

一、如果你使用vi后,却看到画面的右下角有显示目前光标所在的行列号码,那么你的vi已经被vim所取代
二、

[dmtsai@study ~]$ alias
....其他省略....
alias vi='vim'  #重点在这行,这表示当你使用vi这个指令时,其实就是执行vim啦!如果你没有这一行,那么你就必须要使用vim filename来启动vim

三、vim的一般用法与vi完全一样~没有不同
四、假设我想要编辑/etc/services ,则输入vim /etc/services展示如下:
在这里插入图片描述
说明:

  1. 由于/etc/services是系统规划的配置文件,因此vim会进行语法检验,所以你会看到画面中内部主要为深蓝色,且深蓝色那一行是以注解符号(#)开头;
  2. 画面中的最下面一行,在左边显示该文件的属性,包括只读文件、内容共有11176行与670293个字符;
  3. 最下面一行的右边出现的1,1表示光标所在为第一行,第一个字符位置(请看上图中的光标所在);

如果你向下移动到其他位置时,出现的非注解的数据就会有点像这样:
在这里插入图片描述
说明:最右下角的1%代表目前这个画面占整体文件的1%

区块选择(Visual Block)

刚刚我们提到的简单的vi操作过程中,几乎提到的都是以行为单位的操作。那么如果我想要搞定的是一个区块范围呢? 举例来说,像底下这种格式的档案:

192.168.1.1    host1.class.net
192.168.1.2    host2.class.net
192.168.1.3    host3.class.net
192.168.1.4    host4.class.net
.....中间省略......

假设我想要将host1, host2...等等复制起来,并且加到每一行的后面,亦即每一行的结果得是192.168.1.2 host2.class.net host2这样的情况时,传统或现代的窗口型编辑器不容易达到这个需求,但是vim使用区块选择 (Visual Block) 可以办到!当我们按下v或者V或者[Ctrl]+v时,光标移动过的地方就会开始反白,这三个按键的意义分别是:

区块选择的按键意义
v字符选择,会将光标经过的地方反白选择!
V行选择,会将光标经过的行反白选择!
[Ctrl]+v区块选择,可以用长方形的方式选择资料
y将反白的地方复制起来
d将反白的地方删除掉

实际操作:

  1. 使用vim hosts来开启该档案
  2. 将光标移动到第一行的host那个h上头,然后按下[ctrl]-v,左下角出现区块示意字样:
    在这里插入图片描述
  3. 将光标移动到最底部,此时光标移动过的区域会反白!
    在这里插入图片描述
  4. 此时你可以按下y来进行复制,当你按下y之后,反白的区块就会消失不见
  5. 将光标移动到第一行的最右边,并且再用编辑模式向右按两个空格键,回到一般模式后, 再按下p后,如下图所示:
    在这里插入图片描述

多档案编辑

假设你想要将刚刚hosts内的IP复制到/etc/hosts中,那么该如何编辑?我们知道在vi内可以使用:r filename来读入某个档案的内容,不过,这样毕竟是将整个档案读入啊!如果我只是想要部分内容呢?这个时候多档案同时编辑就很有用了。我们可以使用vim后面同时接好几个档案来同时开启喔!相关的按键有:

其他vim使用注意事项

中文编码的问题

一、因为中文编码有big5与utf8两种,如果你的文件是使用big5编码制作的,但在vim的终端接口中你使用的是万国码(utf8),由于编码的不同,你的中文文件内容当然就是一堆乱码了!这时你得要考虑许多东西:

  1. 你的Linux系统默认支持的语系数据:这与/etc/locale.conf有关;
  2. 你的终端接口(bash)的语系:这与LANG, LC_ALL这几个变量有关;
  3. 你的文件原本的编码;
  4. 打开终端机的软件,例如在GNOME下面的窗口接口。

事实上最重要的是上头的第三与第四点,只要这两点的编码一致,你就能够正确的看到与编辑你的中文文件。否则就会看到一堆乱码啦!
二、假设文件内编码为big5,环境是使用Linux的GNOME,启动的终端接口为GNOME-terminal软件, 那鸟哥通常是这样来修正语系编码的行为:

[dmtsai@study ~]$ LANG=zh_TW.big5
[dmtsai@study ~]$ export LC_ALL=zh_TW.big5

然后在终端接口工具列的“终端机”-->“设置字符编码” -->“中文 (正体) (BIG5)”项目点选一下, 如果一切都没有问题了,再用vim去打开那个big5编码的文件

DOS与Linux的断行字符

语系编码转换

想要将big5编码转成utf8,使用iconv这个指令即可!

[dmtsai@study ~]$ iconv --list
[dmtsai@study ~]$ iconv -f 原本编码 -t 新编码 filename [-o newfile]
# 选项与参数:
# --list:列出 iconv 支持的语系数据
# -f:from,亦即来源之意,后接原本的编码格式;
# -t:to,亦即后来的新编码要是什么格式;
# -o file:如果要保留原本的文件,那么使用-o 新文件名,可以创建新编码文件。

# 范例一:将 =/tmp/vitest/vi.big5 转=成 utf8 编码吧!
[dmtsai@study ~]$ cd /tmp/vitest
[dmtsai@study vitest]$ iconv -f big5 -t utf8 vi.big5 -o vi.utf8
[dmtsai@study vitest]$ file vi*
vi.big5: ISO-8859 text, with CRLF line terminators
vi.utf8: UTF-8 Unicode text, with CRLF line terminators

# 范例二:将刚刚那个vi.utf8转成简体的utf8:
[root@www vitest]iconv -f utf8 -t big5 vi.utf8 | \
> iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AOP编程

什么是面向切面编程AOP? 在软件业&#xff0c;AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff…

【个人硬件开源分享】基于ESP32的能量机关主控受控模块,伏虎单手摇杆重力感应加摇杆加LCD屏幕分为左手和右手,基于PD5048A的I2C总线扩展级联器

提示&#xff1a;文章看完后&#xff0c;记得点赞&#xff01; 文章目录前言基于ESP32的能量机关主控受控模块伏虎单手摇杆I2C总线级联器MPU6050陀螺仪WS2812灯珠总结前言 这些是我业余时间做的一些电子小作品&#xff0c;包括基于ESP32的能量机关主控受控模块&#xff0c;伏虎…

在这个技术浮躁的时代也要注重架构的本质,多位大佬联袂推荐小团队构建大网站,让你少走弯路,甚至实现速成,成为优秀架构师!

作为一个技术人&#xff0c;架构师是每个人追寻的目标&#xff0c;也是个人价值和成就的一个重要标志。 那架构师是怎样炼成的呢&#xff1f;或者说&#xff0c;怎样才算是一个优秀的架构师呢&#xff1f; 我们需要几年甚至十几年的一线技术工作经验&#xff0c;我们需要正好遇…

isdigit isdecimal isnumeric 区别

一、代码测试 num "1" #unicode num.isdigit() # True num.isdecimal() # True num.isnumeric() # Truenum "1" # 全角 num.isdigit() # True num.isdecimal() # True num.isnumeric() # Truenum b"1" # byte num.isdigit() # True n…

还在手动电源模块测试吗?ATECLOUD智能云测试解放双手

江苏某生产电源的企业联系到纳米软件Namisoft&#xff0c;了解到他们目前依然使用的是全人工模式进行电源模块参数的测试&#xff0c;经常会因为手动记录数据而导致的一些数据出错&#xff0c;测试的效率也是非常低。通过网络了解到Namisoft的ATECLOUD智能云测试平台&#xff0…

Eruke是什么?怎么搭建?

Eruke是什么&#xff1f;怎么搭建?认识Eureka构成单机构建项目搭建注册中心生产者服务发现自我保护什么是自我保护&#xff1f;为什么会有自我保护&#xff1f;关闭结果演示停更认识Eureka 它是一个基于REST的服务&#xff0c;是实现服务发现与注册的组件。 构成 Eureka采用…

【愚公系列】2022年11月 uniapp专题-运行uniapp的多种方式

文章目录前言一、运行到web平台二、运行到安卓模拟器三、运行到微信开发者工具前言 uniapp本身就是一次开发多端部署&#xff0c;uniapp可以发布成各种应用包括以下几种 web版本 一、运行到web平台 点击工具栏的运行 -> 运行到浏览器 -> 选择浏览器&#xff0c;即可体…

BIOMOD2模型、MaxEnt模型物种分布模拟,生物多样性生境模拟,论文写作

目录 ①基于R语言BIOMOD2模型的物种分布模拟实践技术应用 ②基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作 ③基于MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估 ①基于R语言BIOMOD2模型的物种分布模拟实…

分享Markdown编写文档的技巧

Markdown 是一种轻量级标记语言&#xff0c;使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。Markdown有许多好用简单的用法&#xff0c;下面分享Markdown用来编写文档的技巧。 注&#xff1a;下面通过添加\反斜杠来…

Get To The Point: Summarization with Pointer-Generator Networks

论文题目&#xff1a;《Get To The Point: Summarization with Pointer-Generator Networks》 主要内容&#xff1a;seq2seq&#xff0c;文本摘要 《切中要害&#xff1a;指针生成器网络概述》 摘要 神经序列到序列模型为抽象文本摘要提供了一种可行的新方法&#xff08;这意…

TCP链接异常: SYN_RECV

1. 异常数据包分析&#xff1a; 从数据包分析来看应该是网关这边出问题了&#xff0c;应该是网关的服务程序在1217上出问题了&#xff0c; &#xff08;注意左右量变的数据包的一个syn的Seq都是1358143899&#xff09; 从重发2开始网关这边就一直认为它没有收到client回复给它…

Okhttp连接泄漏警告问题分析

背景 某天在查询生产日志时&#xff0c;发现大量的Okhttp连接泄漏警告日志&#xff0c;但生产上没有收到任何异常反馈。出于好奇心&#xff0c;本地最小化复现问题&#xff0c;并最终解决问题。 分析问题 okhttp官网的demo示例 OkHttpClient client new OkHttpClient();Stri…

【K8S】学习笔记(二)

K8S学习笔记三、Kubernetes 核心概念3.1、kubernetes 集群命令行工具 kubectl3.1.1、kubectl 概述3.1.2、kubectl 命令格式3.1.3、kubectl 基础命令3.1.4、kubectl 部署命令3.1.5、kubectl 集群管理命令3.1.6、kubectl 故障和调试命令3.1.7、kubectl 其它命令3.2、Kubernetes 集…

分组后将成员拼成字符串

【问题】 I have a text file like this: key1 value1 A key1 value2 B key1 value3 A key2 value1 A key2 value2 BI am trying to open it as a dictionary and print the list of keys and values separated by commas so it looks like this in the end: key1 value1,va…

PTA题目 谁先倒

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就输了&#xff0c;输家罚一杯酒。两人同赢或两人同输则继续下一轮&…

智云通CRM:越是害怕被客户拒绝,你就越会被拒绝?

你害怕被客户拒绝码&#xff1f;先别急着说“害怕”&#xff0c;先来看看你为什么会被拒绝&#xff1f;因为你认为自己会失败&#xff01; 很多情况霞&#xff0c;我们会被客户拒绝&#xff0c;原因在哪里&#xff1f;原因有很多&#xff0c;最常见的是因为业务员自身的心理障…

SSM整合(四)

SSM整合之redis设置值和获取值三种方式 准备工作(导入一些必要的依赖) <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.4.1</version> </dependency> <…

ES6 入门教程 19 Generator 函数的语法 19.1 简介

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程19 Generator 函数的语法19.1 简介19.1.1 基本概念19.1.2 yield 表达式19.1.3 与 Iterator 接口的关系19 Generator 函数的语…

Espressif-IDE ESP32 LED Flash 闪烁工程的创建

前言 Espressif-IDE 类似于 eclipse 开发环境&#xff0c;更新 ESP32的开发环境后&#xff0c;发现可以直接使用 Espressif-IDE 进行ESP32 的工程代码开发、程序下载&#xff0c;非常的方便 本篇开始把 ESP32的开发板的LED 点亮&#xff0c;熟悉下 Espressif-IDE 的开发流程 …

MySQL表的高级增删改查

文章目录一、聚合查询二、分组查询三、联合查询内连接外连接自连接四、合并查询五、子查询一、聚合查询 聚合查询是针对行与行之间的计算&#xff0c;常见的聚合函数有: 函数作用COUNT(expr)查询数据的数量SUM(expr)查询数据的总和AVG(expr)查询数据的平均值MAX(expr)查询数据…