Skip to content

Latest commit

 

History

History
354 lines (187 loc) · 7.89 KB

1.6_20170217_vi编辑器和位置参数轮替.md

File metadata and controls

354 lines (187 loc) · 7.89 KB

vi编辑器和bash位置参数轮替

本节主要讲述vim的使用和bash脚本中位置参数轮替是使用方法

vi编辑器

在linux中是使用文本文件来保存配置文件,vi是一个文本编辑器,vi是visual interface的简写,是一个全屏的文本编辑器

vi也是一个模式化的编辑器,不同的模式下,键盘按键的作用是不同的

vim是增强版的vi

vi的一般使用格式 vim [options] [file...].

###vim的模式

vi的模式有三种,分别为编辑模式,输入模式,末行模式

编辑模式:键盘操作被解析为编辑命令,使用vi打开文件默认处在编辑模式,编辑模式也叫命令模式

输入模式:键盘操作被直接存储在文件中,输入模式也叫插入模式

末行模式:vim的内置命令行接口,执行vim的内置命令

###vim的模式转换

使用vim打开文件默认为编辑模式

编辑模式-->输入模式:

使用i键,在当前光标所在处转换为输入模式

使用I键,在当前光标所在行的行首转换为输入模式

使用a键,在当前光标所在处的后面转换为输入模式

使用A键,在当前光标所在行的行尾转换为输入模式

使用o键,在当前光标所在行的下方新增一行空白行转换为输入模式

使用O键,在当前光标所在行的上方新增一行空白行转换为输入模式

**输入模式-->编辑模式:**键盘的ESC键

**编辑模式-->末行模式:**使用:

**末行模式-->编辑模式:**连续两次ESC键

###vim命令

1.退出

在末行模式下

不保存退出::q!

保存修改并退出::wq或:x

编辑模式下,使用ZZ可以实现保存并退出

2.打开文件

  • 一次打开多文件的跳转

    在末行模式下

    下一个文件::next

    上一个文件;:prev

    第一个文件::first

    最后一个文件::last

    退出所有文件::qall

    修改并退出所有文件::wqall

  • 分隔显示多个文件

    使用选项-o或者-O进行文档分隔

    水平分隔-o,文档的跳转使用CTRL+w,使用左右箭头键跳转

    垂直分隔-O,文档的跳转使用CTRL+w,使用上下箭头键跳转

    将一个分档分割为两个:Ctrl+w,然后键入s或v可以将文档水平分隔或者垂直分隔

  • 指定光标位置

    使用选项 +数字,可以打开文件后直接让光标处于指定数字行的行首,省略数字则表示将光标定位到最后一行

3.光标移动

  • 在编辑模式下,单字符移动

    h 左

    l 右

    j 下

    k 上

    可以使用数字加上方向键(hjkl)来跳转多个字符

  • 在编辑模式下,单词移动

    跳至后一个单词的词首:w
    
    跳至当前或前一个词首:b
    
    跳至当前或下一个词尾:e
    
  • 在编辑模式下,行内移动

    跳至绝对行首:0
    
    跳至第一个非空白字符行首:^
    
    跳至绝对行尾:$
    
  • 句子间移动

    ):上一句
    
    (:下一句
    
  • 段落间移动

    }:上一段
    
    {:下一段
    
  • 行间移动

    行间移动:数字G
    
    G移动到最后一行
    

4.编辑操作

  • 删除操作

    删除光标所在处的字符:x

    删除光标所在处向后的指定字符:数字x

  • 删除命令

    使用d命令结合各种光标跳转跳转命令使用,

    删除光标所在处一整行:dd

    删除光标所在的几行整行:数字dd

    末行模式下的范围定界

    在末行模式下可以通过范围定界start,end,可以使用10,19也可以使用10,+9

    .号表示光标当前所在行,在定界中$代表文件尾,

    也可以使用.,$-2,表示从当前行开始删除到文档尾部倒数第二行,

    定界也可是使用模式,如\pat1\,\pat2\表示从当前光标所在行第一次被模式匹配到的行到第二次匹配到的行

    全文使用%表示

  • 替换\改变操作

    先删除光标所在行,并转换为输入模式:cc

    删除光标所在处到行尾,并转换为输入模式:c$

    删除n行:ncc

    c可以结合各种位置操作,参考d

    替换光标所在处的字符:r

  • 复制操作

    支持yy,nyy,y$

  • 粘贴剪切操作

    当复制或删除的是一整行时:

    粘贴到当前光标所在行下方:p

    粘贴到当前光标所在行上方:P

    当复制或删除的是非整行时:

    粘贴到光标所在的字符后面:p

    粘贴到光标所在的字符前面P

  • 撤销编辑

    撤销指定次数的操作,默认为50,:数值u

    Ctrl+r撤销此前的撤销操作

    重复执行此前操作:.

5.翻屏操作

ctrl+f向文件尾部翻一屏

ctrl+b向文件首部翻一屏

ctrl+d向文件尾部翻半屏

ctrl+u向文件首部翻半屏

enter下一行;k上一行

6.查找

/keyword或?keyword,使用n和N来查看查找的结果

查找支持正则表达式,查找的结果会高亮显示,使用:set nohlsearch关闭高亮显示,对当前shell有效

vim的可视化模式

在编辑模式下使用v可以进入可视化模式,可以使用鼠标,可以看到选中的区域,使用V会选中矩形块

vim的窗口属性

末行模式下使用set命令设定vim的窗口属性

显示/取消行号::set nu/nonu

设置/取消自动缩进::set ai/noai

忽略大小写/区分大小写:set ic/noic

显示/不显示对应括号:set sm/nosm(show match)

语法高亮:syntax on/off

搜索高亮:set hlsearch/nohlsearch

vim的配置文件

全局:/etc/vimrc

用户:~/.vimrc

行首的双引号表示注释

vim的查找替换

:地址定界s/查找模式/替换为的内容/gi/

查找模式是正则表达式

替换的内容可以使用引用,但是不可以使用模式

g全局替换,把每一行出现多处匹配都进行替换

i忽略大小写

分隔符/可以使用@或者#等特殊字符替代

&用于在替换查找模式所匹配到的所有内容

例如将一个文本文件中非#开头的行加上#号

:1,30s@^[^#].*@#&@g

bash的位置参数轮替

使用shift进行位置参数轮替,shift默认将位置参数轮替一个位置,即将第二个位置参数改为第一个位置参数进行引用

练习

练习一:vim的查找查找替换

复制/etc/grup.conf至/tmp目录,删除/tmp/grub.conf文件中行首的空白符

cp /etc/grup.conf /tmp

:%s@^[[:space:]]\{1,\}@@g

复制/etc/rc.d/rc.sysinit至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行,行首加#号

:%s@^[[:space]]\{1,\}.*@#&@gi

复制/etc/rc.d/rc.sysinit至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行,替换成#号

:%s@^[[:space]]\{1,\}@#@g

删除/tmp/rc.sysinit文件中以#开头且后面跟了至少一个空白字符的行的行首的#和空白符

:%@^#[[:space:]]\{1,\}\(.*\)@\1@g

:%@^#[[:space:]]\{1,\}@@g

为/tmp/grub.conf文件中的前三行的行首加#号

:1,3s@^@#@g

将/etc/yum.repos.d/CentOS-Media.repo中enable=0一行最后的0改为1;

:%s@enabled=[0-9]@enabled=1@g

:%s@\(enabled=\)[0-9]@\1=1@g

练习二:判断脚本选项

写一个脚本,使用形式如下

userinfo.sh -u username [-v {1|2}]

-u选项用于指定用户;而后脚本显示用户的UID和GID

如果同时使用了-v选项:

-v后面的值如果是1,则额外显示用户的家目录路径;如果是2,额外显示用户的家目录路径和shell

#!/bin/bash
[ $# -lt 2 ] && echo "Too less argements,quit"&& exit 3
if [["$1" == "-u" ]];then
	username="$2"
	shift 2
fi

if [ $# -ge 2 ] && [ $1="-v" ],then
	verFlag=$2
fi

verFlag=${verFlag:-0}

if [ -n $verFlag],then
	if ![[ $verFlag=~[012]]];then
    	echo "wrong parameter"
    	echo "usage:`basename $0` -u username -v {1|2}"
    	exit 4
	fi
fi

if [ $verFlag -eq 1 ],then
	grep "^$username" /etc/passwd | cut -d: -f1,3,4,6
elif  [ $verFlag -eq 2 ],then
	grep "^$username" /etc/passwd | cut -d: -f1,3,4,6,7
else
	grep "^$username" /etc/passwd | cut -d: -f1,3,4
fi