vi/vim编辑器

vi/vim编辑器

  • vi的特点与运用场景
    • vi的使用
      • 简易执行一个案例
      • 按键说明
      • 第一部分:命令模式的按键说明(光标移动、复制粘贴、查找替换)
      • 第二部分:命令模式切换到输入模式的可以按键
      • 第三部分:命令模式切换到底线命令模式的可用按键
    • 命令行模式的保存、退出等命令
  • vim编辑器的使用介绍
    • vim的缓存、恢复与打开时的警告信息
    • vim的额外功能
      • 可视化区块
      • 多文件编辑
      • 多窗口功能
      • 关键词补全功能
      • vim环境设置与记录:~/.vimrc、~/.viminfo
      • vim常用的命令示意图
    • 其他vim使用注意事项
      • 中文编码
      • 语系编码转换
      • DOS与Linux的换行符

vi的特点与运用场景

Vi是最早的文本编辑器之一,主要用于Linux和Unix操作系统中的文本编辑。它是一个纯命令行界面的编辑器,需要一些学习和熟悉才能使用。Vi有着高效的编辑功能,可以处理大型文件和编辑各种编程语言的文件,因此被广泛用于系统配置、编程、文本处理等方面。

vi的使用

基本上vi共分为3种模式,分别是命令模式输入模式底线命令模式

  1. 命令模式

以vi打开一个文件就直接进入一般命令模式了(这是默认模式,也简称为一般模式)。在这个模式中,你可以使用【上下左右】按键来移动光标,也可以使用【删除字符】或【删除整行】来处理文件内容,还可以使用【复制、粘贴】来处理你的文件内容。

  1. 输入模式

一般命令模式中可以进行删除、复制、粘贴等操作,但是无法编辑文件内容。要等你按下【i、L、o、O、a、A、r、R】等任何一个字母之后才会进入编辑模式。如果你要回到一般命令模式,按下【ESC】即可退出编辑模式

  1. 底线命令模式

一般模式当中,输入【 : / ? 】三个中的任何一个按钮,就可以将光标移动到最下面那一行。在这个模式中,可以【查找数据】的操作,还可以读取、保存、批量替换字符、退出vi、显示行号的操作则是在此模式下完成的。

img

简易执行一个案例

  1. 使用【vi filename】进入命令模式
[csq@localhost ~]$ vi csq.txt

如下图我们已经进入到了命令模式

image-20230419090804795

  1. 按下【i】进入输入模式,开始输入一些字符文字

image-20230419091245833

  1. 按下ESC回到命令模式

image-20230419091440042

  1. 进入到底线命令模式,文件保存并退出vi环境

image-20230419091652713

  1. 文件已经建立查看一下
[csq@localhost ~]$ ls -l
总用量 4
-rw-rw-r--. 1 csq csq 57 419 09:17 csq.txt# 需要注意的是,如果你文件权限不对,例如-r--r--r--时,那么可能就无法写入,可以进入到底线命令模式输入【:wq!】强制写入保存。

按键说明

第一部分:命令模式的按键说明(光标移动、复制粘贴、查找替换)

移动光标的方法

参数解释
h或左箭头(←)光标向左移动一个字符
j或下箭头(↓)光标向下移动一个字符
k或上箭头(↑)光标向上移动一个字符
l或下箭头(↓)光标向下移动一个字符

你发现了吗【hjkl】在键盘上是连在一起的,可以通过这四个键来移动光标,如果你想进行多次移动的话:例如向下移动30行,可以使用【30j】或【30↓】的组合键

参数解释
[ctrl]+[f]屏幕【向下】移动一页,相当于[Page Down]按键 (常用)
[ctrl]+[b]屏幕【向上】移动一页,相当于[Page Up]按键 (常用)
[ctrl]+[d]屏幕【向下】移动半页
[ctrl]+[u]屏幕【向上】移动半页
+光标移动到非空格符的下一行
-光标移动到非空格符的上一行
n 那个n表示【数字】,例如20,按下数字后再按空格键,光标会向后移动这一行的n个字符。
0 或功能键[Home]这是数字【0】移东到这一行的最前面字符处(常用)
$或功能键[End]移动到这一行的最后面字符(常用)
H光标移动到这个屏幕的最上方那一行的第一个字符
M光标移动到这个屏幕的中央那一行的第一个字符
L光标移动到这个屏幕的最下方那一行的第一个字符
G移动到这个文件的最后一行(常用)
nGn为数字,移动到这个文件的第n行,例如20G则会移动到这个文件的第20行(配合 :set nu 使用)
gg移动到这个文件的第一行,相当于1G(常用)
n<Enter>n为数字,光标向下移动n行(常用)

查找与替换

参数解释
/word向光标之下寻找一个名称为word的字符串, 可以配和【n,N】进行查找字符串(常用)
?word向光标之上寻找一个字符串为word的字符串
n代表重复前一个查找对象
N和n相反,为反向查找的操作
:n1,n2s/word1/word2/g再第n1行与第n2行查找word1字符串,并将该字符串替换为word2
:1,$s/word1/word2/g从第一行到最后一行寻找word1字符串,并将字符串替换为word2(常用)
:1,$s/word1/word2/gc从第一行到最后一行寻找word1字符串,并将该字符串替换为word2,再替换前显示提示字符给用户确认是否需要替换 (常用)

删除、复制与粘贴

参数解释
x与X在第一行当中,x为向后删除一个字符(相当于[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则为光标的上一行。
J将光标所在行于下一行结合成同一行
c重复删除多个数据,例如向下删除10行,[10cj]
u恢复前一个操作(常用)
[ctrl]+r重做上一个操作(常用)
.这个是小数点,意思是重复前一个操作的意思。

第二部分:命令模式切换到输入模式的可以按键

进入插入或替换的编辑模式

参数解释
i与I进入插入模式:i为【从光标所在处插入】,l为【在目前所在行的一个非空格字符处开始插入】(常用)
a与A进入插入模式:a为【从目前光标所在的下一个字符处开始插入】,A为【从光标所在行的最后一个字符处开始插入】(常用)
o与O进入插入模式:o为【在目前光标所在的下一行处插入新的一行】,O为【在目前光标所在处的上一行插入新的一行】(常用)
r与R进入替换模式:r【只会替换光标所在的那个字符一次】,R【会一直替换光标所在的文件,知道按下ESC为止】(常用)
[Esc]退出底线命令模式

第三部分:命令模式切换到底线命令模式的可用按键

命令行模式的保存、退出等命令

参数解释
:w将数据写入硬盘文件中(常用)
:w!若文件属性为【只读】时,强制写入文件。关于你能不能写入跟你的权限有关
:q退出vi(常用)
:q!强制退出不保存
:wq保存退出,【wq!】为强制保存退出退出
ZZ若文件没有修改则不保存退出,若修改则保存退出(常用)
:w [filename]将编辑的数据保存成另一个文件(类似新文件)
:r [filename]在编辑的数据中。读入另一个文件的数据,就是将[filename]这个文件加到光标所在行的后面
:n1,n2 w [filename]将n1 到 n2 的内容保存为filename这个文件
:! command暂时退出 vi 命令行模式下执行command的显示结果。例如【:! ls /home】即可在vi当中查看/home下面以ls输出的文件信息
:set nu显示行号
:set nonu取消行号

vim编辑器的使用介绍

Vim是Vi的改进版,也是Linux和Unix系统中常用的文本编辑器。相比于Vi,Vim增加了许多新的功能和改进的用户界面。它支持多级撤销、语法高亮、自动补全、多窗口支持等功能,使得用户可以更加高效地编辑文本。Vim同样是一个纯命令行界面的编辑器,需要一些学习和熟悉才能使用。和Vi一样,Vim也被广泛用于系统配置、编程、文本处理等方面。

vim的缓存、恢复与打开时的警告信息

目前主要的文本编辑软件都会有恢复的功能,当你的系统因为特殊原因宕机了,还可以通过特别的机制将你之前未保存的数据【救】回来

使用vim编辑器时,vim会在与编辑器的文件目录下,在建立一个名为【.filename.swp】的文件。

比如说你有个文件file.txt 当你在编辑这个文件时,vim会主动的建立【.file.txt.swp】的缓存,你对file.txt做的操作都会被记录到这个【.file.txt.swp】里。如果你系统宕机了,你可以通过这个文件来进行恢复。

首先我们先制造一个假的宕机然后进行恢复

  1. 创建文件,进入vim然后按ctrl + z 暂停进程
[root@localhost ~]# cp -rf /etc/man_db.conf /root/csrfile.txt # 将文件复制过来
[root@localhost ~]# vim csrfile.txt  # 在里面写几句话然后 ctrl + z 将vim暂停并放置到后台[3]+  已停止               vim csrfile.txt
  1. 查看缓存文件
[root@localhost ~]# ls -al
总用量 16
dr-xr-x---.  2 root root   65 419 21:18 .
dr-xr-xr-x. 17 root root  224 45 20:11 ..
-rw-r--r--.  1 root root 5184 419 21:18 csrfile.txt
-rw-r--r--.  1 root root 4096 419 21:18 .csrfile.txt.swp  # 这就是缓存文件
  1. 我们将真在系统后台暂停的vim给kill掉,来模拟宕机情况。然后继续使用vim编辑csrfile.txt文件
[root@localhost ~]# vim csrfile.txtE325: 注意
发现交换文件 ".csrfile.txt.swp"所有者: root    日期: Wed Apr 19 21:18:19 2023文件名: ~root/csrfile.txt修改过: 是用户名: root      主机名: localhost.localdomain进程 ID: 103214
正在打开文件 "csrfile.txt"日期: Wed Apr 19 21:18:14 2023(1) Another program may be editing the same file.  If this is the case,be careful not to end up with two different instances of the samefile when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.如果是这样,请用 ":recover""vim -r csrfile.txt"恢复修改的内容 (请见 ":help recovery")。如果你已经进行了恢复,请删除交换文件 ".csrfile.txt.swp"以避免再看到此消息。交换文件 ".csrfile.txt.swp" 已存在!
以只读方式打开([O]), 直接编辑((E)), 恢复((R)), 删除交换文件((D)), 退出((Q)), 中止((A)):

这是vim编辑器的一个提示信息,表示在打开文件时发现了交换文件(.swp文件),因此vim会主动判断你的这个文件可能会有些问题,上面的描述内容中给出了两种解决方法

问题一:可能有其他人或程序同时在编辑这个文件

由与多人多任务的环境下,因此很可能有很多人同时在编辑同一个文件。在很多人共同编辑的情况下,万一大家同时保存,那么这个文件就会很乱。为了避免这个问题vim会出现这个警告窗口,解决方法是:

  • 找到另外的那个程序员,让他vim的工作结束,然后你再继续处理
  • 如果你只是看该文件内容不会编辑任何东西,可以选择只读(O)

问题二:在前一个vim环境中,可能因为某些不知名的原因导致vim中断,解决方法很多,常见的方法有:

  • 如果你之前vim处理操作尚未保存,此时你应该按下【R】,就是使用R的选项,此时vim会加载.csrfile.txt.swp的内容,让你来决定要不要保存,这样你就能够救回来之前未保存的信息。恢复后这个.csrfile.txt.swp文件并不会删除,需要自己手动删除。
  • 如果你认为这个缓存是没有用的,那你可以直接按下【D】删除掉这个缓存。此时会加重csrfile.txt的内容,并将旧的.csrfile.txt.swp文件删除,建立这次会使用的新的.csrfile.txt.swp。

【O】:以只读方式打开文件

【E】:直接编辑文件,不会加载缓存的内容

【R】:加载缓存内容,救回你之前未保存的内容

【D】: 删除交换文件

【Q】:退出编辑器

【A】:中止当前操作

vim的额外功能

vim不仅具有缓存文件恢复的功能,vim还有具有颜色显示功能,并且还支持许多的程序语法,因此,当你使用vim编辑程序时(不论是C语言,还是shell脚本),我们的vim将可帮你直接进行【程序除错(debug)】的功能

如果你在命令行输入alias时,会出现这样的画面

[root@localhost ~]# alias
....
.....
alias vi='vim'   

这表示当你使用vi这个命令时,其实使用的vim。

我们来看看vim的界面是怎么样的,假设我想要编辑【/etc/services】,则输入【vim /etc/services】

image-20230420090149345)

上面vim的界面示意图,在这个界面中有几点特色要说明:

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

除了注释之外,其他的行就会有特别的颜色显示,可以避免打错字,最右下角%0代表目前你阅读到这一行占整体文件的0%

可视化区块

刚刚我们提到简单的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办得到,那就可以使用可视化区块。当我们按下v或V或[Ctrl + v]时,这个时候光标移动过的地方就会开始泛白。这三个键分别的意义时

参数介绍
v字符选择,会将光标经过的地方泛白选择
V行选择,会将光标经过的行泛白选择
ctrl + v可视化区块,可以用矩形的方式选择数据
y将泛白的地方复制起来
d将泛白的地方删除掉
p将刚刚复制的区块,在光标所在处粘贴

我们来进行实际操作,就是将host再加到每一行的最后面。你可以这样做:

  1. 使用【vim csrhosts】来打开文件(可以自行准备一个测试文件)
  2. 将光标移动到第一行的host那个h上面,然后按下【ctrl + v】左下角出现可视块示意字样

image-20240310124036534

  1. 将光标移动到最底部,此时光标移动过的区域会泛白

image-20240310124102979

  1. 此时你可以按下【y】来进行复制,当按下【y】之后,泛白的区块就会消失不见。
  2. 最后,将光标移动到第一行最右边,按【i】进入编辑模式按下一个空格然后按下【ESC】按再下【p】后就会发现已经复制成功了

image-20240310124233840

多文件编辑

假设我想要将刚刚我们的csrhosts文件内的IP复制到你的/etc/hosts 这个文件夹内,可以使用【:r filename】来读取某个文件的内容,不过,这样毕竟是将整个文件读入。

如果我向只读入部分内容,这时候多文件编辑就很有用了,我们可以使用vim后面同时接好几个文件来同时打开,相关的按键有:

参数解释
:n编辑下一个文件
:N编辑上一个文件
:files列出目前这个vim开启的所有文件

做一下练习,假设你要将刚刚提供的【csrhosts】内的前四行 IP数据复制到你的【/etc/hosts】文件内,那可以怎么进行?

  1. 通过【 vim /etc/hosts csrhosts 】命令来使用一个vim打开两个文件
  2. 在vim中先使用【:files】查看一下编辑的文件数据有什么?如下图的最后一行显示的是【请按下ENTER或其他命令继续】就会回到vim的命令模式

image-20240310125203312

  1. 在第一行输入【4yy】复制4行
  2. 在vim的环境下输入【:n】会来到第二个编辑的文件,就是/etc/hosts内
  3. 在/etc/hosts 按下【G】到最后一行,再输入【p】粘贴

image-20240310125141785

  1. 按下多次的【u】来还原原本的数据

  2. 最终按下【:q】来退出vim的多文件编辑

利用多文件编辑功能,可以让你很快地就将需要的数据复制到正确的文件内,当然这个功能也可以利用窗口界面来达到

多窗口功能

想象一下这两个情况:

  • 当我有一个文件非常大,我查到后面的数据时,想要对照前面的数据,是否需要使用 【ctrl + f】与【ctrl + b】(或PageUp,PageDown功能键)来跑前跑后查看?
  • 我有两个需要对照着看的文件,不想使用前一小节提到的多文件编辑功能:

在一般窗口界面下的编辑软件大多有【划分窗口】或是【冻结窗口】的功能来将一个文件划分成多个窗口的展现,那么vim能达到这个功能,想要划分窗口并放入文件,在命令行模式输入【:sp [filename]】即可。如果想要在新窗口启动同一个csrhosts文件,输入【:sp】即可

image-20240310125813202

再输入【:sp /etc/hosts】时

image-20240310125849298

看到了吗,两个文件同时再一个屏幕上显示,你还可以利用【ctrl + w + ↑】及【ctrl + w + ↓】在多个窗口之间移动。这样复制、查看就会变得很简单,划分窗口相关命令很多只介绍一下几种

参数:
:sp [filename]    :打开一个新窗口,如果有加filename,表示在新窗口创建一个新文件否则表示两个窗口为同一个文件内容(同步显示)
ctrl + w + j      :按键的按法是:先按下ctrl不放,再按下w后放开所有的键之后再按下j,则光标可移动到下方窗口
ctrl + w + ↓      :按键的按法是:先按下ctrl不放,再按下w后放开所有的键之后再按下向下的箭头,则光标可移动到下方窗口
ctrl + w + k      :同上,不过光标移动到上面的窗口
ctrl + w + ↑      :同上,不过光标移动到上面的窗口
ctrl + w + q      :其实就是:q结束退出。举例来说,如果我想要结束下方的窗口那么利用ctrl + w ↓ 移动到下方窗口后,输入:q即可退出也可以按下ctrl + w + q 此外也可输入【:close】关闭所在的窗口

关键词补全功能

主要的vim补齐功能

组合键(正在编辑的情况下按组合键)补全内容
【ctrl + x】 => 【ctrl + n】通过目前正在编辑的这个【文件的内容文字】作为关键字,给予补齐
【ctrl + x】=> 【ctrl + f】以当前目录内的文件名作为关键词,给予补齐
【ctrl + x】=> 【ctrl + o】以扩展名为语法补充,以vim内置的关键词,给予补齐

比较有用的是第一个和第三个组合键,第一个组合键中,你可能会再同一个文件里面重复出现许多相同的关键词,那么就能够通过这个来补全,如下图

image-20240310131139684

如果你想要使用vim内置的语法检验功能来处理取得关键词补全,那么第三个选项就很有用。不过你要注意,如果你想要使用第三个功能,就得要注意你编辑的文件的扩展名,我们下面来做个简单测试。

假设我们要编写网页,忘记

后面跟什么参数了就可以使用第三个功能,可以列出很多相关的关键词让你选择。注意,一定要使用正确的扩展名,否则会无法出现任何关键词。

image-20240310131410487

vim环境设置与记录:/.vimrc、/.viminfo

如果我们以vim软件来查找一个文件内部的某个字符时,这个字符串会泛白,而下次我们再次以vim编辑这个文件时,该查找的字符串泛白情况还是存在的。甚至于在编辑其他文件时,如果其他文件内也存在这个字符串,竟然还是会主动泛白

搜索

image-20240310131845104

再次编辑

image-20240310131922262

编辑/etc/hosts

image-20240310132003845

另外,我们重复编辑同一个文件时,当第二次进入该文件时,光标竟然就在上次退出的那一行上面。

这是因为我们的vim会主动地将你曾经做过的操作记录下来,好让你下次可以轻松作业,这个记录操作文件就是:【~/.viminfo】。如果你曾经使用过vim,那你的根目录应该会存在这个文件才对。这个文件是自动生产的,不用自行建立。在vim里所做过的操作,可以在这个文件内查询到。

此外,每个Linux发行版对vim的默认环境都不太相同,举例来说,某些版本在查到关键词时并不会高度泛白,有些版本则会主动帮你进行缩进的操作。但是这些都是可以设置的,那就是vim的环境设置,整体vim的设置一般放置在【/etc/vimrc】这个文件中,不过不建议你修改它,你可以修改【~/.vimrc】这个文件(默认不存在,需要自行手动建立),将你所希望的设置值写入。

vim的环境设置参数

参数解释
:set nu(:set nonu)就是设置行号和取消行号(nonu)
:set hlsearch(:set nohlsearch)hlsearch就是high light search(高亮度查找)
:set autoindent(:set noautoindent)是否自动缩进?autoindent就是自动缩进
:set backup是否自动保存备份文件?一般是nobackup的,如果设置backup的话,那么当你修改任何一个文件时,则源文件会被另存成一个文件名为filename~ 的文件。
:set ruler还记得我们提到右下角的一些状态栏说明?这个ruler就是在设置显示或不显示该设置值的
:set showmode这个则是,是否显示 --INSERT-- 这类的字眼在左下角的状态栏
:set backspace=(012)一般来说,如果我们按下【i】进入编辑模式后,可以利用退格键【Backspace】来删除任意字符。但是,某些Linux发行版则不许如此。此时,我们就可以通过backspace来设置,当backspace为2时,就是可以删除任意值;0或1时,仅可删除刚刚输入的字符,而无法删除原本就已经存在的文件
:set all显示目前所在的环境参数设置值
:set显示 系统默认值不同的设置参数,一般来说就是你有自行变动过的设置参数
:syntax on(:syntax off)是否依据程序相关语法显示不同颜色?举例来说,在编辑一个纯文本文件时,如果开头是以 # 开始,那么该行就会变成蓝色。
:set bg=dark(:set bg=light)可用以显示不同的颜色色调,默认是【light】,如果你常常发现注释的深蓝色字体很不容易看,那么这里可以设置为【dark】,试看看,会有不同的样式

可以这样设置【~/.vimrc】

[root@localhost ~]# vim ~/.vimrc 
set bg=dark     # 显示不同的底色色调(经实验好像至是把带颜色的字加粗了)
set nu          # 显示行号
set hlsearch    # 高亮泛白
set ruler       # 可显示最后一行的状态
set backspace=2 # 可随时用退格键删除
syntax on       # 进行语法检验
set autoindent  # 自动缩进

在编写【~/.vimrc】这个文件时 我们也可以使用vim的关键词补全功能 我们上面没有介绍,可以使用【ctrl + x】=>【ctrl + v】 来补全vim命令非常好用,如下图

image-20230420201435686

vim常用的命令示意图

img

其他vim使用注意事项

vim功能非常强大,下面我们还有一些要注意的事项

中文编码

很多人经常会遇到它们的vim无法正常显示中文,这是为什么呢?如下图

image-20230421090845442其实很有可能是因为编码的问题。

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

事实上最重要的是上面的第三和第四点,只要这两点的编码一致,就能够正确的看到与编辑你的中文文件,否则就是一堆乱码

[root@localhost ~]# LANG=”zh_CN.UTF-8“
[root@localhost ~]# export  LC_ALL=“zh_CN.UTF-8”
[root@localhost ~]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=zh_CN.UTF-8
# LANG 和 LC_ALL 是环境变量,用于设置 Linux 系统的本地化语言环境。 
# LANG 变量用于设置系统的默认语言环境,它影响所有的本地化工具和应用程序、
# 比如,LANG=en_US.UTF-8 表示使用英语(美国)的 UTF-8 编码# LC_ALL 变量用于覆盖 LANG 变量,它会强制设置所有本地化工具和应用程序的语言环境
# 比如,LC_ALL=zh_CN.UTF-8 表示强制使用中文(中国)的 UTF-8 编码

image-20230421091125192

语系编码转换

假如你想要将GBK编码转成UTF-8,这时候应该咋办呢?难不成每个文件打开都转成UTF-8吗?其实可以使用iconv 这个命令就行了,

iconv --list
iconv -f 原本编码 -t 新编码 filename [-o newfile]
选项:
--list:列出iconv支持的语系数据
-f:from,就是来源的意思,后面接原本的编码格式
-t:to,就是后来的新编码是什么格式
-o file:如果要保留原本的文件,那么使用-o 新文件名,可以建立新编码文件

那么该如何转换呢?

  1. 首先vim创建一个文件里面写一点内容
[root@localhost ~]# vim zw
呵呵呵呵呵   <==这个是写的内容
  1. 将zw文件的编码转换成BIG-5编码
# 首先看看iconv支持不支持BIG-5语系编码
[root@localhost ~]# iconv --list |grep BIG-5
BIG-5//   # 支持
[root@localhost ~]# iconv -f UTF-8 -t BIG-5 zw  -o zwbig5
[root@localhost ~]# file zwbig5 
zwbig5: ISO-8859 text

image-20230421093928189

看见了吗编码已经转换了

  1. 再把它转换回来
[root@localhost ~]# iconv -f BIG-5 -t UTF-8 zwbig5 -o utf8zw
[root@localhost ~]# file utf8zw 
utf8zw: UTF-8 Unicode text

image-20230421094743626

DOS与Linux的换行符

DOS和Linux系统在换行符的使用上有所不同。
在DOS系统中,每行的结尾是由两个字符组成的,即“回车符”(CR)和“换行符”(LF)。这是由当初的打印机技术决定的,为了打印机能够回到行首并换行,需要发送两个字符。因此,DOS系统中的文本文件中每行结尾都是“CR+LF”。
在Linux系统中,每行的结尾只有一个“换行符”(LF)。这是因为在Unix时代,打印机只需要一个“换行符”就能回到行首并换行。因此,在Linux系统中,文本文件中每行结尾只有一个“LF”。
这种差异造成的结果是,如果在Windows系统中编写的文本文件打开到Linux系统中,每行结尾就会多出一个“CR”字符。而如果在Linux系统中编写的文本文件打开到Windows系统中,每行结尾就会少一个“CR”字符,导致文本格式混乱。
为了解决这个问题,一些编辑器和工具会自动处理文本文件的换行符,例如Notepad++、Sublime Text等编辑器会自动识别并转换换行符格式。此外,也可以使用一些特定的工具来进行换行符的转换,例如dos2unix和unix2dos等命令行工具。

dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]
选项:
-k:保留该文件原本的mtime 时间格式(不更新文件上次内容经过自定义的时间)
-n:保留原本的旧文件,将转换后的内容输出到新文件,如:dos2unix -n old new

使用之前先确保自己安装了这两个命令

[root@localhost csr]# yum install -y unix2dos

将/etc/man_db.conf 重新复制到/tmp/csr/ 下面,并将其修改为dos换行

[root@localhost csr]# mkdir /tmp/csr/
[root@localhost csr]# cd /tmp/csr/
[root@localhost csr]# cp -a /etc/man_db.conf .
[root@localhost csr]# ll man_db.conf 
-rw-r--r--. 1 root root 5171 420 19:32 man_db.conf
[root@localhost csr]# unix2dos -k man_db.conf 
unix2dos: converting file man_db.conf to DOS format ...   # 显示这行信息,就表示换行转为DOS格式了
[root@localhost csr]# ll man_db.conf 
-rw-r--r--. 1 root root 5302 420 19:32 man_db.conf
# 因为换行符多了^M,所以容量增加了

将上述的man_db.conf 转成Linux换行符,并保留旧文件,新文件放于 man_db.conf.linux

[root@localhost csr]# dos2unix -k -n man_db.conf man_db.conf.linux
dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format ...
[root@localhost csr]# ls
man_db.conf  man_db.conf.linux
[root@localhost csr]# ll
总用量 16
-rw-r--r--. 1 root root 5302 420 19:32 man_db.conf
-rw-r--r--. 1 root root 5171 420 19:32 man_db.conf.linux
[root@localhost csr]# file man_db.conf*
man_db.conf:       ASCII text, with CRLF line terminators  # 很清楚说明的是CRLF换行
man_db.conf.linux: ASCII text

,所以容量增加了


将上述的man_db.conf 转成Linux换行符,并保留旧文件,新文件放于 man_db.conf.linux```shell
[root@localhost csr]# dos2unix -k -n man_db.conf man_db.conf.linux
dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format ...
[root@localhost csr]# ls
man_db.conf  man_db.conf.linux
[root@localhost csr]# ll
总用量 16
-rw-r--r--. 1 root root 5302 4月  20 19:32 man_db.conf
-rw-r--r--. 1 root root 5171 4月  20 19:32 man_db.conf.linux
[root@localhost csr]# file man_db.conf*
man_db.conf:       ASCII text, with CRLF line terminators  # 很清楚说明的是CRLF换行
man_db.conf.linux: ASCII text

如果你在不同的系统之间复制一些纯文本文件时,千万记得要使用unix2dos或dos2unix来转换一下换行格式。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【fastllm】学习框架,本地运行,速度还可以,可以成功运行chatglm2模型

1&#xff0c;关于 fastllm 项目 https://www.bilibili.com/video/BV1fx421k7Mz/?vd_source4b290247452adda4e56d84b659b0c8a2 【fastllm】学习框架&#xff0c;本地运行&#xff0c;速度还可以&#xff0c;可以成功运行chatglm2模型 https://github.com/ztxz16/fastllm &am…

ai学习前瞻-python环境搭建

python环境搭建 Python环境搭建1. python的安装环境2. MiniConda安装3. pycharm安装4. Jupyter 工具安装5. conda搭建虚拟环境6. 安装python模块pip安装conda安装 7. 关联虚拟环境运行项目 Python环境搭建 1. python的安装环境 ​ python环境安装有4中方式。 从上图可以了解…

YOLO语义分割标注文件txt还原到图像中

最近做图像分割任务过程中&#xff0c;使用labelme对图像进行标注&#xff0c;得到的数据文件是json&#xff0c;转换为YOLO训练所需的txt格式后&#xff0c;想对标注文件进行检验&#xff0c;即将txt标注文件还原到原图像中&#xff0c;下面是代码&#xff1a; import cv2 im…

C++指针(五)完结篇

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09;、C指针&#xff08;四&#xff09;万字图文详解&#xff01; 本篇博客是介…

交易平台开发:构建安全/高效/用户友好的在线交易生态圈

在数字化浪潮的推动下&#xff0c;农产品现货大宗商品撮合交易平台已成为连接全球买家与卖家的核心枢纽。随着电子商务的飞速发展&#xff0c;一个安全、高效、用户友好的交易平台对于促进交易、提升用户体验和增加用户黏性至关重要。本文将深入探讨交易平台开发的关键要素&…

git学习(创建项目提交代码)

操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …

Pytorch学习 day09(简单神经网络模型的搭建)

简单神经网络模型的搭建 针对CIFAR 10数据集的神经网络模型结构如下图&#xff1a; 由于上图的结构没有给出具体的padding、stride的值&#xff0c;所以我们需要根据以下公式&#xff0c;手动推算&#xff1a; 注意&#xff1a;当stride太大时&#xff0c;padding也会变得很大…

视频推拉流EasyDSS平台直播通道重连无法转推的原因排查与解决

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 用户使用EasyDSS平台对直播通道进行转推&#xff0c;发现只要关闭…

AOP切面编程,以及自定义注解实现切面

AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发&#xff0c;加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理&#xff0c;没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…

【滑动窗口】力扣239.滑动窗口最大值

前面的文章我们练习数十道 动态规划 的题目。相信小伙伴们对于动态规划的题目已经写的 得心应手 了。 还没看过的小伙伴赶快关注一下&#xff0c;学习如何 秒杀动态规划 吧&#xff01; 接下来我们开启一个新的篇章 —— 「滑动窗口」。 滑动窗口 滑动窗口 是一种基于 双指…

03.axios数据提交和错误处理

一.axios常用请求方法和数据提交 1. 想要提交数据&#xff0c;先来了解什么是请求方法 请求方法是一些固定单词的英文&#xff0c;例如&#xff1a;GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE&#xff0c;PATCH&#xff08;这些都是http协议规定的&#xff09;&am…

axios的详细使用

目录 axios&#xff1a;现代前端开发的HTTP客户端王者 一、axios简介 二、axios的基本用法 1. 安装axios 2. 发起GET请求 3. 发起POST请求 三、axios的高级特性 1. 拦截器 2. 取消请求 3. 自动转换JSON数据 四、axios在前端开发中的应用 五、总结 axios&#xff1a…

vue中性能优化

目录 1. 编码优化 2. 源码优化 3. 打包优化 4. 利用 Vue Devtools 总结 Vue.js 作为一个强大的前端框架&#xff0c;提供了丰富的功能和工具来帮助开发者构建高效的 Web 应用。然而&#xff0c;在开发过程中&#xff0c;性能优化仍然是一个需要关注的问题。以下是对 Vue.j…

3/7—21. 合并两个有序链表

代码实现&#xff1a; 方法1&#xff1a;递归 ---->难点 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* mergeTwoLists(struct ListNode *list1, struct ListNode *list2) {/*1.如果l1为…

Luajit 2023移动版本编译 v2.1.ROLLING

文章顶部有编好的 2.1.ROLLING 2023/08/21版本源码 Android 64 和 iOS 64 luajit 目前最新的源码tag版本为 v2.1.ROLLING on Aug 21, 2023应该是修正了很多bug, 我是出现下面问题才编的. cocos2dx-lua 游戏 黑屏 并报错: [LUA ERROR] bad light userdata pointer 编…

空间复杂度的OJ练习——轮转数组

旋转数组OJ链接&#xff1a;https://leetcode-cn.com/problems/rotate-array/ 题目&#xff1a; 思路&#xff1a; 通过题目我们可以知道这是一个无序数组&#xff0c;只需要将数组中的数按给定条件重新排列&#xff0c;因此我们可以想到以下几种方法&#xff1a; 1.暴力求解法…

详解DNS服务

华子目录 概述产生原因作用连接方式 因特网的域名结构拓扑分类域名服务器类型划分 DNS域名解析过程分类解析图图过程分析注意 搭建DNS域名解析服务器概述安装软件bind服务中的三个关键文件 配置文件分析主配置文件共4部分组成区域配置文件作用区域配置文件示例分析正向解析反向…

Linux 之七:Linux 防火墙 和进程管理

防火墙 查看防火墙 查看 Centos7 的防火墙的状态 sudo systemctl status firewalld。 查看后&#xff0c;看到active(running)就意味着防火墙打开了。 关闭防火墙&#xff0c;命令为&#xff1a; sudo systemctl stop firewalld。 关闭后查看是否关闭成功&#xff0c;如果…

js【详解】async await

为什么要使用 async await async await 实现了使用同步的语法实现异步&#xff0c;不再需要借助回调函数&#xff0c;让代码更加易于理解和维护。 (async function () {// await 必须放在 async 函数中try {// 加载第一张图片const img1 await loadImg1()// 加载第二张图片co…

第一代高通S7和S7 Pro音频平台:超旗舰性能,全面革新音频体验

以下文章来源于高通中国 如今&#xff0c;音频内容与形式日渐丰富&#xff0c;可满足人们放松心情、提升自我、获取资讯等需求。得益于手机、手表、耳机、车载音箱等智能设备的广泛应用&#xff0c;音频内容可以更快速触达用户。从《音频产品使用现状调研报告2023》中发现&…