第5章:文本处理工具
文本查看、文本处理

cat、tac、rev ====================================================================== cat 用于连接文件并打印到标准输出设备上。 -n 或 --number:由 1 开始对所有输出的行数编号。 -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。 -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。 -v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。 -E 或 --show-ends : 在每行结束处显示 $。 -T 或 --show-tabs: 将 TAB 字符显示为 ^I。 -A, --show-all:等价于 -vET。 -e:等价于"-vE"选项; -t:等价于"-vT"选项; tac 查看文件内容(按行翻转文件内容,即最后一行显示在第一行) rev 左右岸字符翻转行的内容(示例:abc,使用rev查看,显示为cba)

more、less、head、tail、tailf ====================================================================== more 分页查看文件内容 ls -R /etc/ |more -------------------------------------------------- less 分页查看文件内容(less命令是man命令使用的分页器) -N 显示行号 less页面的操作方法 向下翻屏: 空格键,^v;^f;^F (^v=ctrl+v) 向上翻屏: b;^b 向上翻半屏: d;^d 向下翻半屏: u;^u; 向下翻行: ^N;e;^E;j;^J 向上翻行: y;^Y;^P;k;^K 退出: q 跳转到指定行: # 回到文件首页: 1G 翻至文件尾部: G 搜索关键字 /keyword 下一个被搜索的关键字 n 上一个被搜索的关键字 N 搜索关键字 ?keyword (功能同/搜索,但方向相反) -------------------------------------------------- head 默认查看文件前10行内容 -n 查看前指定数量行,例如 -n 5;-n5;-5 -c 查看前指定数量字节 -number 查看指定前几行 -------------------------------------------------- tail 默认查看文件后10行内容 -n 同head -c 同head -f 跟踪文件尾部的变化,常用于日志监控,相当于--follow=descriptor -F 跟踪文件名 -------------------------------------------------- tailf命令 类似tail -f

cut、paste、wc、sort、uniq ====================================================================== 按列抽取文本cut、合并文件paste cut 按列切割 -d 指定分隔符 -f 指定哪列,多列用逗号 -c 按字符切割 --output-delimiter=STRING 指定输出分隔符 cut -d":" -f1,3,5 /etc/passwd #指定分隔符,查看1,3,5列 cut -d":" -f3-5 /etc/passwd #指定分隔符,查看3-5列 cut -d":" -f1,4 --output-delimiter="***" /etc/passwd #切割时,指定分隔符":",输出时,显示分隔符"***" -------------------------------------------------- paste 命令用于合并文件的列。把每个文件以列对列的方式,一列列地加以合并。 -d<间隔字符>或--delimiters=<间隔字符> 用指定的间隔字符取代跳格字符。默认分隔符为tab -s或--serial 串列进行而非平行处理。 --help 在线帮助。 --version 显示帮助信息。 -------------------------------------------------- wc命令用于计算字数。wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。 -c或--bytes或--chars 只显示Bytes数。 -l或--lines 显示行数。 -w或--words 只显示字数。 wc file #默认显示行数,单词数,总bytes数,文件名 wc -c f2 #显示总bytes数,文件名 wc -l f2 #显示行数,文件名 wc -w f2 #显示单词数,文件名 -------------------------------------------------- sort命令用于将文本文件内容加以排序。针对文本文件的内容,以行为单位来排序。 -b 忽略每行前面开始出的空格字符。 -c 检查文件是否已经按照顺序排序。 -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。 -f 排序时,将小写字母视为大写字母。 -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。 -m 将几个排序好的文件进行合并。 -M 将前面3个字母依照月份的缩写进行排序。 -n 依照数值的大小排序。 -u 意味着是唯一的(unique),输出的结果是去完重了的。 -o<输出文件> 将排序后的结果存入指定的文件。 -r 以相反的顺序来排序。 -R 随机排序 -k numbet #-t指定的分隔符分割后,按照-k指定的列数进行排序 -t<分隔字符> 指定排序时所用的栏位分隔字符。 +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。 sort -t: -k3 /etc/passwd #指定分隔符":",按照第3列进行排序,默认是按照首字符的ascii码表进行排序 sort -t: -k3 -n /etc/passwd #指定分隔符":",按照第3列进行排序,按照数值大小进行排序 -------------------------------------------------- uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。 -c或--count 在每列旁边显示该行重复出现的次数。 -d或--repeated 仅显示重复出现的行列。 -u或--unique 仅显示出一次的行列。 -f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。 -s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。 -w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。 sort test.txt | uniq -c cat xxxx |cut -f1 |sort -n |uniq -c

diff、patch ====================================================================== diff命令用于比较文件的差异。 diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。 -u,-U<列数>或--unified=<列数> 以合并的方式来显示文件内容的不同。 -------------------------------------------------- patch命令用于修补文件。 patch让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。 diff -u f1 f2 > diff.log #比较f1 f2文件的不同点,保存到diff.log中 rm -f f1 #文件f1丢失 patch -b f2 diff.log #根据diff.log进行文件修补,找回丢失的f1文件;命令结束后,f2文件为原f1文件,f2.orig文件为原f2文件

hexdump主要用来查看“二进制”文件的十六进制编码。*注意:它能够查看任何文件,不限于与二进制文件。* -n length:格式化输出文件的前length个字节 -C:输出规范的十六进制和ASCII码 -b:单字节八进制显示 -c:单字节字符显示 -d:双字节十进制显示 -o:双字节八进制显示 -x:双字节十六进制显示 -s:从偏移量开始输出 hexdump -C file #cat是不能查看数据文件的,可以查看ASCII text;可以用file命令判断文件的类型
文本编辑器:vi/vim命令
其他编辑器(了解):nano;图形界面编辑器:gedit,gvim

vim命令 ========================================================================================== vim [options] [file ..] +[num] #打开文件后,光标移动到指定行行首;+默认行尾 +/{pat} #打开文件后,光标移动到第一个被pat匹配到的行的行首 -b #二进制方式打开文件 -d #比较多个文件 -m #只读方式打开文件 示例: vim filename #当文件不存在时,会自动创建该文件
vim的三种模式:普通模式、扩展命令模式、编辑模式

vim普通模式:文本查看、编辑操作(复制、粘贴、删除等)、退出vim界面 ========================================================================================== 以vi打开一个文件就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或删除整行来处理文件内容, 也可以使用复制、粘贴来处理你的文件数据。 返回普通模式:ESC ------------------------------------------------------------------------------------------ 移动光标: 按单词移动光标: w 光标移动到下一个单词的词首 e 光标移动到当前or下一个单词的词尾 b 光标移动到当前or下一个单词的词首 当前页跳转: H 光标移动到页首 M 光标移动到页中间行 L 光标移动到页底 行首行尾跳转: 0 光标移动到当前行首 ^ 光标移动到行首第一个非空白字符 $ 光标移动到当前行尾(windows shift会切换输入法,不好用!) 行间移动: G(shift+g) 光标移动到文件尾行 gg 光标移动到文件首行(等价于1gg) 数字gg 光标移动到指定行 句间移动 (、) 段落间移动 {、} 翻屏操作: ctrl+f 向尾部翻一屏 ctrl+b 向首部翻一屏 ctrl+d 向尾部翻半屏 ctrl+u 向首部翻半屏 拓展:数字+动作 例如5右箭头:光标往右移动5个字符;5w:光标往右移动到第5个词语的词首 ------------------------------------------------------------------------------------------ 编辑操作(复制、粘贴、删除等): yy 复制光标所在的当前行内容 nyy 复制光标所在行往下的n行内容 p 将已复制的内容粘贴到光标的下一行 P 将已复制的内容粘贴到光标的上一行(视觉效果:复制内容挤占了当前行,光标以下的内容全部下移一行) dd 剪切光标所在的当前行内容 ndd 剪切多行内容(往下剪切) u 回滚操作 ctrl+r 撤销上一个回滚操作,即向前回滚 . 重复执行上一个动作(不是向前回滚操作!) x 向后删除字符(其实是剪切) X 向前删除字符 d1G 删除当前行至第一行 dG 删除当前行至最后一行 d0 删除文本,当前光标到行首 d$ 删除文本,当前光标到行尾 ~ 转换大小写 J 删除当前行后的换行符 r 替换一个字符 R 切换到repalce模式 ------------------------------------------------------------------------------------------ ZZ 保存并退出 ZQ 不保存退出

vim编辑模式 ========================================================================================== 在一般模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容,只有当到你按下【i, I, o, O, a, A, r, R】等任何一个字母之后才会进入编辑模式。这时候屏幕的左下方会出现【INSERT或 REPLACE】的字样,此时才可以进行编辑。而如果要回到一般模式时, 则必须要按下【Esc】即可退出编辑模式。 进入编辑模式: i 插入***** A 追加 行尾插入 o 下一行开头插入 O 上一行开头插入 a 光标下一个字符插入 vim内容输出时携带颜色 达到类似echo -e "\e[1;31mred\e[0m"的效果 在编辑模式下 输入^[[1;31mred^[[0m,其中“^[”的输入手法:ctrl+v然后再按ctrl+[] vim中的^[ 相当于echo中的\e,也相当于\033

vim扩展命令模式:查找、读取、存盘、替换字符、离开vi、显示行号等的动作 ========================================================================================== 输入【 : / ? 】三个中的任何一个,就可以将光标移动到最底下那一行。在这个模式中, 可以提供查找、读取、存盘、替换字符、离开vi、显示行号等的动作则是在此模式中完成的! vim界面执行shell命令行命令 :!command 示例:(:!cat test.txt) ------------------------------------------------------------------------------------------ 保存与退出vim :wq 退出并保存 :wq! 退出并强制保存,“!”为强制的意思 :q! 强制退出,不保存 ------------------------------------------------------------------------------------------ 显示行号与取消显示行号 :set nu 显示行号 :set nonu 与set nu相反,取消行号 ------------------------------------------------------------------------------------------ 搜索操作: /word 从光标位置开始,向下搜索指定word;示例:/3306 继续搜 按n,反向搜N ?word 向上搜索(与/word功能相同,但搜索方向相反);示例:?80 继续搜 按n,反向搜N n 执行上一次的搜索操作;上次为/搜索,那么n=/搜索;上次为?搜索,那么n=?搜索 N 与n相反 ------------------------------------------------------------------------------------------ 地址定界 num1 第num1行 num1,num2 从第num1行开始,到num2行接收 num1,+num2 从第num1行开始,包含之后的num2行 . 当前行 $ 最后一行 .,$-1 当前行到倒数第二行 1,$ 全文 % 全文,相当于1,$ /pat1/,/pat2/ 从第一个被pat1匹配到的行开始,到第一个被pat2匹配到的行为止 num1,/pat2/ /pat1/,num2 /pat1/,$ 替换操作:(s是替换 g表示全局(所有)) :%s/A/B/g 把符合A的内容替换为B。(/为分隔符,可以用@、#等替代) 示例:(:%s/world/oldgirl/g)(:%s#world#oldgirl#g) :g/A/s//B/g 这个也是将A替换为B :n1,n2s/A/B/g 把符合A的内容替换为B(不是全文替换,而是指定n1,n2行之间内容进行替换)。 :n1,n2s/A/B/gc 添加c之后需要逐个进行确认后才进行替换 :%s/A/B/ 不加g也能全局替换嘛,那么g到底什么用的呢? 引用符号:\1、\2、...、& 修饰符:i(忽略大小写);g(全局替换);gc(全局替换,每次替换前询问) ------------------------------------------------------------------------------------------ 移动or保存文件部分内容 :n1,n2 w filename 将指定行内容保存为filename这个文件 :n1,n2 co n3 将指定行内容拷贝到n3位置下 :n1,n2 m n3 将制定行内容移动到n3位置下 ------------------------------------------------------------------------------------------ 分屏显示 :vs filename 垂直分屏显示(左右2块屏幕) :sp filename 水平分屏显示(上下2块屏幕)

vim的寄存器 有26个命名寄存器和1个无命名寄存器,长存放不同的剪切板内容,可以在不同会话间共享(即跨越不同终端进行复制粘贴) 寄存器名称abc..z,格式: "寄存器 放在数字和命令之间 例如:3"tyy 表示复制3行到t寄存器中;"tp 表示将t寄存器的内容进行粘贴 未指定则使用无命名寄存器 有10个数字寄存器,用0123456789表示,0存放最近复制的内容,1存放最近删除的内容。 当心的文本变更和删除时,1转存到2,2转存到3,一次类推。数字寄存器不能在不同会话间共享

定制vim的工作特性与.vimrc文件 配置文件: 全局:/etc/vimrc 个人:~/.vimrc Vim 启动时,会根据配置文件(.vimrc)来设置 Vim Vim 配置文件分为系统配置文件和用户配置文件: 系统配置文件位于 Vim 的安装目录(默认路径为 /etc/.vimrc); 用户配置文件位于主目录 ~/.vimrc,即通过执行 vim ~/.vimrc 命令即可对此配置文件进行合理修改。通常情况下,Vim 用户配置文件需要自己手动创建。 https://www.cnblogs.com/xnqc1314/p/8692993.html

[root@yefeng ~]# cat .vimrc ""========================================================================= " ""CRiption: 适合自己使用的vimrc文件,for Linux/Windows, GUI/Console " ""========================================================================= syntax on "自动语法高亮 "winpos 5 5 " 设定窗口位置 "set lines=40 columns=155 " 设定窗口大小 "set nu " 显示行号 set go= " 不要图形按钮 "color asmanian2 " 设置背景主题 set guifont=Courier_New:h10:cANSI " 设置字体 "syntax on " 语法高亮 "autocmd InsertLeave * se nocul " 用浅色高亮当前行 "autocmd InsertEnter * se cul " 用浅色高亮当前行 "set ruler " 显示标尺 set showcmd " 输入的命令显示出来,看的清楚些 "set cmdheight=1 " 命令行(在状态行下)的高度,设置为1 "set whichwrap+=<,>,h,l " 允许backspace和光标键跨越行边界(不建议) "set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离 set novisualbell " 不要闪烁(不明白) "set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "状态行显示的内容 "set laststatus=1 " 启动显示状态行(1),总是显示状态行(2) set foldenable " 允许折叠 set foldmethod=manual " 手动折叠 "set background=dark "背景使用黑色 set nocompatible "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 " 显示中文帮助 if version >= 603 set helplang=cn set encoding=utf-8 endif " 设置配色方案 "colorscheme murphy "字体 "if (has("gui_running")) " set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 "endif set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set encoding=utf-8 set fileencodings=ucs-bom,utf-8,cp936 set fileencoding=utf-8 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""新文件标题"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "新建.c,.h,.sh,.java文件,自动插入文件头 autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" ""定义函数SetTitle,自动插入文件头 func SetTitle() "如果文件类型为.sh文件 if &filetype == 'sh' call setline(1,"\#!/bin/bash") call append(line("."), "\#########################################################################") call append(line(".")+1, "\# File Name: ".expand("%")) call append(line(".")+2, "\# Author: yefeng") call append(line(".")+3, "\# mail: 185932437@qq.com") call append(line(".")+4, "\# Created Time: ".strftime("%c")) call append(line(".")+5, "\#########################################################################") call append(line(".")+6, "") else call setline(1,"\#!/bin/bash") call append(line("."), "\*************************************************************************") call append(line("."), " > File Name: ".expand("%")) call append(line(".")+1, " > Author: yefeng") call append(line(".")+2, " > Mail: 185932437@qq.com ") call append(line(".")+3, " > Created Time: ".strftime("%c")) call append(line(".")+4, " ************************************************************************/") call append(line(".")+5, "") endif " if &filetype == 'cpp' " call append(line(".")+6, "#include<iostream>") " call append(line(".")+7, "using namespace std;") " call append(line(".")+8, "") " endif " if &filetype == 'c' " call append(line(".")+6, "#include<stdio.h>") " call append(line(".")+7, "") " endif "新建文件后,自动定位到文件末尾 autocmd BufNewFile * normal G endfunc """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "键盘命令 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" nmap <leader>w :w!<cr> nmap <leader>f :find<cr> " 映射全选+复制 ctrl+a map <C-A> ggVGY map! <C-A> <Esc>ggVGY map <F12> gg=G " 选中状态下 Ctrl+c 复制 vmap <C-c> "+y "去空行 nnoremap <F2> :g/^\s*$/d<CR> "比较文件 nnoremap <C-F2> :vert diffsplit "新建标签 map <M-F2> :tabnew<CR> "列出当前目录文件 map <F3> :tabnew .<CR> "打开树状文件目录 map <C-F3> \be "C,C++ 按F5编译运行 map <F5> :call CompileRunGcc()<CR> func! CompileRunGcc() exec "w" if &filetype == 'c' exec "!g++ % -o %<" exec "! ./%<" elseif &filetype == 'cpp' exec "!g++ % -o %<" exec "! ./%<" elseif &filetype == 'java' exec "!javac %" exec "!java %<" elseif &filetype == 'sh' :!./% endif endfunc "C,C++的调试 map <F8> :call Rungdb()<CR> func! Rungdb() exec "w" exec "!g++ % -g -o %<" exec "!gdb ./%<" endfunc """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ""实用设置 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " 设置当文件被改动时自动载入 set autoread " quickfix模式 autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr> "代码补全 set completeopt=preview,menu "允许插件 filetype plugin on "共享剪贴板 set clipboard+=unnamed "从不备份 set nobackup "make 运行 :set makeprg=g++\ -Wall\ \ % "自动保存 set autowrite "set ruler " 打开状态栏标尺 set cursorline " 突出显示当前行 set magic " 设置魔术 set guioptions-=T " 隐藏工具栏 set guioptions-=m " 隐藏菜单栏 "set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\ " 设置在状态行显示的信息 set foldcolumn=0 set foldmethod=indent set foldlevel=3 set foldenable " 开始折叠 " 不要使用vi的键盘模式,而是vim自己的 set nocompatible " 语法高亮 set syntax=on " 去掉输入错误的提示声音 set noeb " 在处理未保存或只读文件的时候,弹出确认 set confirm " 自动缩进 set autoindent set cindent " Tab键的宽度 set tabstop=4 " 统一缩进为4 set softtabstop=4 set shiftwidth=4 " 不要用空格代替制表符 set noexpandtab " 在行和段开始处使用制表符 set smarttab " 显示行号 set number " 历史记录数 set history=1000 "禁止生成临时文件 set nobackup set noswapfile "搜索忽略大小写 set ignorecase "搜索逐字符高亮 set hlsearch set incsearch "行内替换 set gdefault "编码设置 set enc=utf-8 set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 "语言设置 set langmenu=zh_CN.UTF-8 set helplang=cn " 我的状态行显示的内容(包括文件类型和解码) "set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%] " 总是显示状态行 "set laststatus=2 " 命令行(在状态行下)的高度,默认为1,这里是2 set cmdheight=2 " 侦测文件类型 filetype on " 载入文件类型插件 filetype plugin on " 为特定文件类型载入相关缩进文件 filetype indent on " 保存全局变量 set viminfo+=! " 带有如下符号的单词不要被换行分割 set iskeyword+=_,$,@,%,#,- " 字符间插入的像素行数目 set linespace=0 " 增强模式中的命令行自动完成操作 set wildmenu " 使回格键(backspace)正常处理indent, eol, start等 set backspace=2 " 允许backspace和光标键跨越行边界 set whichwrap+=<,>,h,l " 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位) set mouse=a set selection=exclusive set selectmode=mouse,key " 通过使用: commands命令,告诉我们文件的哪一行被改变过 set report=0 " 在被分割的窗口间显示空白,便于阅读 set fillchars=vert:\ ,stl:\ ,stlnc:\ " 高亮显示匹配的括号 set showmatch " 匹配括号高亮的时间(单位是十分之一秒) set matchtime=1 " 光标移动到buffer的顶部和底部时保持3行距离 set scrolloff=3 " 为C程序提供自动缩进 set smartindent " 高亮显示普通txt文件(需要txt.vim脚本) au BufRead,BufNewFile * setfiletype txt "自动补全 :inoremap ( ()<ESC>i :inoremap ) <c-r>=ClosePair(')')<CR> :inoremap { {<CR>}<ESC>O :inoremap } <c-r>=ClosePair('}')<CR> :inoremap [ []<ESC>i :inoremap ] <c-r>=ClosePair(']')<CR> :inoremap " ""<ESC>i :inoremap ' ''<ESC>i function! ClosePair(char) if getline('.')[col('.') - 1] == a:char return "\<Right>" else return a:char endif endfunction filetype plugin indent on "打开文件类型检测, 加了这句才可以用智能补全 set completeopt=longest,menu """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " CTags的设定 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" let Tlist_Sort_Type = "name" " 按照名称排序 let Tlist_Use_Right_Window = 1 " 在右侧显示窗口 let Tlist_Compart_Format = 1 " 压缩方式 let Tlist_Exist_OnlyWindow = 1 " 如果只有一个buffer,kill窗口也kill掉buffer let Tlist_File_Fold_Auto_Close = 0 " 不要关闭其他文件的tags let Tlist_Enable_Fold_Column = 0 " 不要显示折叠树 autocmd FileType java set tags+=D:\tools\java\tags "autocmd FileType h,cpp,cc,c set tags+=D:\tools\cpp\tags "let Tlist_Show_One_File=1 "不同时显示多个文件的tag,只显示当前文件的 "设置tags set tags=tags "set autochdir """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "其他东东 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "默认打开Taglist let Tlist_Auto_Open=1 """""""""""""""""""""""""""""" " Tag list (ctags) """""""""""""""""""""""""""""""" let Tlist_Ctags_Cmd = '/usr/bin/ctags' let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口 " minibufexpl插件的一般设置 let g:miniBufExplMapWindowNavVim = 1 let g:miniBufExplMapWindowNavArrows = 1 let g:miniBufExplMapCTabSwitchBufs = 1 let g:miniBufExplModSelTarget = 1
set paste 之后进行插入操作,vim提示变为: -- INSERT (粘贴) -- 这时就不再有自动换行。
之后,如果要恢复,:set nopaste
正则表达式BRE/ERE

linux正则与通配符的区别、linux正则说明 ---------------------------------------------------------------------------------------------------------- 正则表达式与通配符的区别: 最常应用正则表达式的命令是grep(egrep),sed,awk。 正则表达式和通配符有本质区别:正则匹配的是文件内容;通配符匹配的是文件名 环境准备: export LC_ALL=C #为了去除所有本地化的设置,让命令能正确执行。 POSIX规范将正则表达式的分为了两种 基本正则表达式(BRE,basic regular expression) 扩展正则表达式(ERE,extended regular expression) BRE和ERE的区别仅仅是元字符的不同 BRE(基础正则表达式)只承认的元字符有^$.[]* 其他字符识别为普通字符: ERE(扩展正则表达式)则添加了(){}?+|等 只有在用反斜杠“\”进行转义的情况下,字符(){}才会在BRE被当作元字符处理,而BRE中,任何元符号前面加上反斜杠反而会使其被当作普通字符来处理。

基础正则表达式BRE ^ ^word: 搜索以word开头的内容 $ word$: 搜索以word结尾的内容 ^$ 表示空行,不是空格 . 代表且只能代表任意一个字符(不匹配空行) \ 转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点 * 重复之前的字符或文本0个或多个,之前的文本或字符连续0次或多次 .* 任意多个字符 ^.* 以任意多个字符串开头,.*尽可能多,有多少算多少,贪婪性 [abc] 匹配任意字符a或b或c [^abc] 匹配不包含^后的任意字符a或b或c,是对[abc]的取反,且与^含义不同 a\{n,m\} 重复前面a字符n到m次(如果用egrep或sed -r可去掉斜线) \+;\?;等等 \<或\b 词首锚定,类似^,但用于锁定词首 \>或\b 词尾锚定,类似$,但用于锁定词尾 \<pattern\>或\bpattern\b 锁定整个单词 分组:\(\)将一个或多个字符当做一个整理进行处理 分组括号中的模式匹配到的内容被正则引擎记录与内部的变量中,这些变量命名为\1、\2、\3、\4、... 注意:这些变量储存的是匹配到的内容,而不是pattern本身;多级的分组,以左边第一个括号来判断 示例:echo rootrbbt |grep "\(r..t\)\1" #此处\1为root,所以匹配无结果

扩展正则表达式ERE + 重复前一个字符一次或一次以上,前一个字符连续一个或多个,把连续的文本/字符取出 ? 重复前面一个字符0次或1次(.是有且只有1个) 管道符| 表示或者同时过滤多个字符 () 分组过滤被括起来的东西表示一个整体(一个字符) a{n,m} 匹配前一个字符最少n次,最多m次 a{n,} 匹配前一个字符最少n次 a{n} 匹配前一个字符正好n次 a{,m} 匹配前一个字符最多m次 \<或\b 词首锚定,类似^,但用于锁定词首 \>或\b 词尾锚定,类似$,但用于锁定词尾 \<pattern\>或\bpattern\b 锁定整个单词 分组:\(\)将一个或多个字符当做一个整理进行处理 分组括号中的模式匹配到的内容被正则引擎记录与内部的变量中,这些变量命名为\1、\2、\3、\4、... 注意:这些变量储存的是匹配到的内容,而不是pattern本身;多级的分组,以左边第一个括号来判断 示例:echo rootrbbt |grep "\(r..t\)\1" #此处\1为root,所以匹配无结果

元字符(grep -P可用) [root@yefeng ~]# echo 1234567abcdefg |grep \d \b 单词边界 \bcool\b匹配cool,不匹配coolant \B 非单词边界 cool\B匹配coolant不匹配cool \d 单个数字字符 b\db匹配b2b,不匹配bcb \D 单个非数字字符 b\Db匹配bcb不匹配b2b \w 单个单词字符(字母,数字与_) \w匹配1或a,不匹配& \W 单个非单词字符 \W匹配&,不匹配1或a \n 换行符 \n匹配一个新行 \s 单个空白字符 x\sx匹配xx,不匹配xx \S 单个非空白字符 x\S\x匹配xkx,不匹配xx \r 回车 \r匹配回车 \t 横向制表符 \t匹配一个横向制表符 \v 垂直制表符 \v匹配一个垂直制表符 \f 换页符 \f匹配一个换页符

预定义的正则表达式 [:alnum:] [a-zA-Z0-9]匹配任意一个字母或数字字符 [[:alnum:]]+ [:alpha:] 匹配任意一个字母字符(包括大小写字母) [[:alpha:]]{4} [:blank:] 空格与制表符(横向纵向) [[:blank:]]* [:digit:] 匹配任意一个数字字符 [[:digit:]]? [:lower:] 匹配小写字母 [[:lower:]]{5,} [:upper:] 匹配大写字母 ([[:upper:]]+)? [:punct:] 匹配标点符号 [[:punct:]] [:space:] 匹配一个包括换行符,回车等在内的所有空白符 [[:space:]]+ [:graph:] 匹配任何一个可以看得见的且可以打印的字符 [[:graph:]] [:xdigit:] 任何一个十六进制数 [[:xdigit:]]+ [:cntrl:] 任何一个控制字符(ASCII字符集中的前32个字符) [[:cntrl:]] [:print:] 任何一个可以打印的字符 [[:print:]] 通配符似乎也支持这种预定义的格式
linux中的正则没有python中的小括号那种灵活的用法,若想取出python小括号匹配的内容,那么在linux则是多次使用grep进行过滤
三剑客:grep[egrep]、sed、awk
grep 文本搜索工具,根据用户指定的'模式'对目标文本逐行进行匹配。
sed 行编辑器:取行,替换,删除,追加
awk 取列

grep[egrep]命令 ============================================================ grep只能使用基础正则表达式BRE。egrep可以使用扩展正则表达式ERE grep -E extend扩展的grep,即egrep -F 相当于fgrep,不支持正则表达式 -P Perl正则(python正则和这个很像,-P模式下才能用\d匹配数字) -A after显示过滤的字符串和它之后的多少行 -B before显示过滤的字符串和它之前的多少行 -C context显示过滤的字符串和它前后的多少行 --color=auto 过滤的内容加色 -v invert取反,显示不被pattern匹配到的行 -i ignore不区分大小写 -n number对输出的内容显示在源文件中的行号 -w word按单词为单位过滤 -o 只显示匹配的内容 -q 静默模式,不输出任何信息 -e 同时匹配多个pattern,pattern之间逻辑或关系 -f 多个pattern存放在文本中,grep使用文件中的多个pattern进行匹配 示例: grep old test1.txt grep -o old test1.txt grep -E 'aaa|bbb' test1.txt #匹配aaa或bbb grep -f pattern.txt test1.txt grep -A4 old test1.txt 能不用管道就不用管道,因为效率相对较低 egrep -o "(e)(s)\1\2" oldboy.txt ===== egrep -o "eses" oldboy.txt \1第一个括号 \2 第二个括号

sed命令与用法 =========================================================================================== Sed stream editor行编辑器,主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 常用功能有对文件实现快速增删改查(增加、删除、修改、查询), 其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行)。 普通循环:读取一行,执行script,最后清除模式空间;读取下一行,开始下一个循环... 特殊'D'循环:读取第一行,执行script,直到script中的D,然后根据D删除第一行内容,进入下一个script循环... 模式空间(pattern space)和保持空间(hold space) 模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。 保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。 sed [-hnV][-e<script>][-f<script文件>][文本文件] 参数说明: -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。 -e 执行多次,例如sed -e 's#oldboy#oldgirl#g' -e 's#112233#445566#g' test.txt -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。 -h或--help 显示帮助。 -n或--quiet或--silent 仅显示script处理后的结果。 -V或--version 显示版本信息。 -i 直接修改文件的内容 -i.xx 备份文件后缀为.xx,同时修改原文件的内容 -r 支持扩展正则 ------------------------------------------------------------------------------ 示例:sed -n 1p test.txt #打印第一行的内容 '2,5d' 动作d:将第 2~5 行删除! '3,$d' 动作d:删除第3行到最后一样 '2!d' 动作d:取反,除第2行外都删除 '2aword' 动作a:在第2行之后插入新的一行,a后为插入的内容 '$a # This is a test' 动作a:在最后1行之后插入新的一行,a后为插入的内容 '2i drink tea' 动作i:在第2行插入内容;原内容(包括第2行)下移一行 '2,5c No 2-5 number' 动作c:将第2-5行的内容替换为新内容 '/root/p' 动作p:搜索包含指定内容的行,并打印 '/root/d' 动作d:搜索包含指定内容的行,并删除 's/要被取代的字串/新的字串/' 动作s:替换(无g,默认每行只替换第一个匹配到的,即只替换一次) 's/要被取代的字串/新的字串/g' 动作s:替换(匹配的全部替换) 进阶: 搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行: nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'

sed script说明 即script的内容写入到''中,分为2部分Address+Command: Address:指定处理范围,不指定address则对全文进行处理 Command:对行内容的处理动作,详见动作说明 -------------------------------------------------------------- 其中script可以表示为'AddressCommand' Address说明: 0.无指定行则默认对全文进行处理 1.指定行,例如:2 特殊行:$最后一行;$-1倒数第二行 2.指定多行, 例如:2,5指定第2-5行 2,+3 指定第2行开始,以及之后的3行 4./RegExp/ 5./RegExp1/,/RegExp2/ 指定多行:从第一次匹配到RegExp1开始,到第一次匹配到RegExp2为止,之间的所有行 6.~步进 1~2 奇数行 2~2 偶数行 -------------------------------------------------------------- 动作说明(Command说明): a:插入内容,在指定行后新增一行,并插入内容(若插入的首字符为空格,在空格前添加'\'即可) i:插入内容,在指定行插入内容;同时将原指定行以及之后的所有内容下移一行(若插入的首字符为空格,在空格前添加'\'即可) s/RegExp/string/修饰符:替换字符串,通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! 修饰符:g全局替换;i忽略字符大小写 特殊:()----\1,\2;&==正则匹配到的所有 s###g 's#o\(ot\)#\1#g' #oot替换为ot 's#oot#&OOT#g' #oot后追加OOT c:替换行内容; c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!(若插入的首字符为空格,在空格前添加'\'即可) p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ !:模式空间中匹配行取反处理 w /path/file 保存模式匹配的行至指定文件 r /path/file 读取指定文件的文本至模式空间中 =:为模式空间中的行打印行号 高级编辑命令(高级动作)(涉及保持空间的操作): d 删除模式空间的内容,开始下一个循环. h、 H 复制/追加模式空间的内容到保持空间. g、 G 复制/追加保持空间的内容到模式空间. x 交换保持空间和模式空间的内容. n、N 读取下一行,覆盖/追加至模式空间 D 如果模式空间不包含换行符,请像发出d命令一样开始正常的新循环。 否则,删除模式空间中的文本,直到第一行换行,然后使用结果模式空间重新开始循环,而无需读取新的输入行。 例如:sed 'N;p;D' 111.txt 0.sed读入第一行 1.执行N动作,读入第2行;此时模式空间有第1,2行内容 2.执行p动作,打印了模块空间的内容,即第1,2行内容 3.执行D动作,因为模式空间内有2行内容,删除内容知道第一行换行,即删除了第1行内容;模式空间只有第2行内容;同时直接开始循环,即开始下一轮'N;p;D'。(所以在有D的sed命令行语句中,-n没有意义) 4.指定N动作,读入下一行,即读入第3行;此时模式空间有第2,3行内容 5.执行p动作... 6.执行D动作...

awk用法与示例 ====================================================================== AWK是一种处理文本文件的语言,是一个强大的文本分析工具。 AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 awk [选项参数] 'script' var=value file(s) awk [选项参数] -f scriptfile var=value file(s) awk命令选项参数说明: -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 -v var=value or --asign var=value 赋值一个用户定义变量。 -f scripfile or --file scriptfile 从脚本文件中读取awk命令。 -mf nnn and -mr nnn 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 -W compact or --compat, -W traditional or --traditional 在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。 -W copyleft or --copyleft, -W copyright or --copyright 打印简短的版权信息。 -W help or --help, -W usage or --usage 打印全部awk选项和每个选项的简短说明。 -W lint or --lint 打印不能向传统unix平台移植的结构的警告。 -W lint-old or --lint-old 打印关于不能向传统unix平台移植的结构的警告。 -W posix 打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。 -W re-interval or --re-inerval 允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。 -W source program-text or --source program-text 使用program-text作为源代码,可与-f命令混用。 -W version or --version 打印bug报告信息的版本。 --------------------------------------------------------------------- 示例: awk '{print $1}' /etc/passwd #默认分隔符为' ',打印第一个变量 awk -F: '{print $1,$4}' /etc/passwd #指定分隔符为':',打印第1、4个变量 awk '-F:' '{print $1,$4}' /etc/passwd #功能同上,注意-F的变化 awk -F':' '{print $1,$4}' /etc/passwd #功能同上,注意-F的变化 awk -F ':' '{print $1,$4}' /etc/passwd #功能同上,注意-F的变化 awk '-F:' '{print $1,$NF}' /etc/passwd #指定分隔符为':',打印第1个变量和最后一个变量 awk '-F[:/]' '{print $1,$NF}' /etc/passwd #功能同上,但区别在于指定了2种分隔符,所以最后一个变量的值不同! awk -F: '-va=100' '{print $3,$3+a}' /etc/passwd #设置变量a=100,然后输出变量 awk -F: '-va=100' -vb=200 '{print $3,$3+a,$3+b}' /etc/passwd #设置多个变量 awk -f {awk脚本} {文件名} awk -F: '/root/{print $1,$3}' /etc/passwd #获取行内容中含有root的行,同时指定分隔符,打印第1、3个变量 awk -F: '$6 ~/root/{print $1,$3}' /etc/passwd #获取第6列内容含有root的行,同时指定分隔符,打印第1、3个变量 ~ 表示模式开始。// 中是模式。不理解。。。 awk 'NR>1&&NR<4' oldboyedu.txt #取test.txt文件的第2行到第3行的内容。 awk '/root/' oldboyedu.txt #过滤出含有root字符串的行※。 awk '/^[^r]/' oldboyedu.txt #删除含有root字符串的行※。其实这个只是通过正则进行匹配而已,匹配非r开头而已,并不是删除。。。 [^r] 非r ^[^r] 以非r字符卡头 awk -F ":" '{print NR,$1,$3,$NF}' oldboyedu.txt #取文件的第一列、第三列和最后一列内容,并打印行号※。

awk命令支持的运算符、awk命令常用内建变量 ====================================================================== awk命令支持的运算符 描述 = += -= *= /= %= ^= **= 赋值 ?: C条件表达式 || 逻辑或 && 逻辑与 ~ 和 !~ 匹配正则表达式和不匹配正则表达式 < <= > >= != == 关系运算符 空格 连接 + - 加,减 * / % 乘,除与求余 + - ! 一元加,减和逻辑非 ^ *** 求幂 ++ -- 增加或减少,作为前缀或后缀 $ 字段引用 in 数组成员 --------------------------------------------------------------------- awk命令常用内建变量 $0 整行 $NF 最后一列 倒数第一列 $(NF-1) 倒数第二列 内建变量 描述 $n 当前记录的第n个字段,字段间由FS分隔 $0 完整的输入记录 NF 一条记录的字段的数目 NR 已经读出的记录数,就是行号,从1开始 ARGC 命令行参数的数目 ARGIND 命令行中当前文件的位置(从0开始算) ARGV 包含命令行参数的数组 CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 ERRNO 最后一个系统错误的描述 FIELDWIDTHS 字段宽度列表(用空格键分隔) FILENAME 当前文件名 FNR 各文件分别计数的行号 FS 字段分隔符(默认是任何空格) IGNORECASE 如果为真,则进行忽略大小写的匹配 OFMT 数字的输出格式(默认值是%.6g) OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 ORS 输出记录分隔符(默认值是一个换行符) RLENGTH 由match函数所匹配的字符串的长度 RS 记录分隔符(默认是一个换行符) RSTART 由match函数所匹配的字符串的第一个位置 SUBSEP 数组下标分隔符(默认值是/034)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!