最後由jazy編輯 鑒於大家在使用VI 的時候有一定的陌生,在這裡借花獻佛,從兄弟版[SHELL]中整理出以下關於VI編程的高級技巧,希望對大家學習 UNIX 有所幫助,並希望大家能結合使用HPUX的心得體會對這些經驗進行進一步的擴展。 1.交換兩個字符位置 xp 2.上下
最後由jazy編輯
鑒於大家在使用VI 的時候有一定的陌生,在這裡借花獻佛,從兄弟版[SHELL]中整理出以下關於VI編程的高級技巧,希望對大家學習
UNIX有所幫助,並希望大家能結合使用HPUX的心得體會對這些經驗進行進一步的擴展。
1.交換兩個字符位置
xp
2.上下兩行調換
ddp
3.把文件內容反轉
:g/^/m0/ (未通過)
4.上下兩行合並
J
5.刪除所有行
dG
6.從當前位置刪除到行尾
d$
7.從當前位置復制到行尾
y$ 如果要粘貼到其他地方 p 就可以了
由於vi 是建立在 EX 上的 所以 當鍵入 : 時就來到了 EX 命令狀態
8.
:ab string strings
例如 ":ab usa United States of America" ,
當你在文見裡插入 usa 時
United States of America 就蹦出來了
9.
:map keys new_seq
定義你當前 鍵盤命令
10.
:set [all]
vi or ex 的編輯狀態
如 顯示每行 :set nu
11.
在命令狀態下,nyy表示拷貝從光標行起的下n行內容,p表示paste,可剛復制的內容粘貼在光標處的
下面。
12.
單個字符替換用r,覆蓋多個字符用R,用多個字符替換一個字符用s,整行替換用S
13.
:%s/old_word/new_word/g
這個指令是於在整個文件中替換特定字符串
14.光標控制
k:上移 nk 上移n行
j:下移 nj 下移n行
將光標移到第n行,按下 mk
將光標移到第m行,按下 "ay'k
即將第n到m的行存到a寄存器,以此類推,b,c........寄存器等
這樣就可以將你常用的需要復用的內容粘貼到不同的寄存器中以備用
想粘貼到某處,直接將光標移到某地,按下 ‘ap 即可,以此類推,b,c........寄存器等
在當前屏幕中
H 跳到第一行
M 跳到中間一行
L 跳到最後一行
15.
表8-2 刪除命令
刪除命令操作
d l 刪除當前字符(與x命令功能相同)
d 0 刪除到某一行的開始位置
d ^ 刪除到某一行的第一個字符位置(不包括空格或TA B字符)
d w 刪除到某個單詞的結尾位置
d 3 w 刪除到第三個單詞的結尾位置
d b 刪除到某個單詞的開始位置
d W 刪除到某個以空格作為分隔符的單詞的結尾位置
d B 刪除到某個以空格作為分隔符的單詞的開始位置
d 7 B 刪除到前面7個以空格作為分隔符的單詞的開始位置
d) 刪除到某個語句的結尾位置
d 4) 刪除到第四個語句的結尾位置
d( 刪除到某個語句的開始位置
d } 刪除到某個段落的結尾位置
d { 刪除到某個段落的開始位置
d 7 { 刪除到當前段落起始位置之前的第7個段落位置
d d 刪除當前行
d /t e x t 刪除從文本中出現“ t e x t”中所指定字樣的位置,一直向前直到下一個該字樣所出現的
位置(但不包括該字樣)之間的內容
d fc 刪除從文本中出現字符“c”的位置,一直向前直到下一個該字符所出現的位置(包括
該字符)之間的內容
d tc 刪除當前行直到下一個字符“ c”所出現位置之間的內容
D 刪除到某一行的結尾
d $ 刪除到某一行的結尾
5 d d 刪除從當前行所開始的5行內容
d L 刪除直到屏幕上最後一行的內容
d H 刪除直到屏幕上第一行的內容
d G 刪除直到工作緩存區結尾的內容
d 1 G 刪除直到工作緩存區開始的內容
修改命令操作
c l 更改當前字符
c w 修改到某個單詞的結尾位置
c 3 w 修改到第三個單詞的結尾位置
c b 修改到某個單詞的開始位置
c W 修改到某個以空格作為分隔符的單詞的結尾位置
c B 修改到某個以空格作為分隔符的單詞的開始位置
c 7 B 修改到前面7個以空格作為分隔符的單詞的開始位置
c 0 修改到某行的結尾位置
c) 修改到某個語句的結尾位置
c 4) 修改到第四個語句的結尾位置
c( 修改到某個語句的開始位置
c } 修改到某個段落的結尾位置
c { 修改到某個段落的開始位置
c 7 { 修改到當前段落起始位置之前的第7個段落位置
c tc 修改當前行直到下一個字符c所出現位置之間的內容
C 修改到某一行的結尾
c c 修改當前行
5 c c 修改從當前行所開始的5行內容
.重復上一次修改!
表8-4 替換命令
替換命令操作
s 將當前字符替換為一個或多個字符
S 將當前行替換為一個或多個字符
5 s 將從當前字符開始的5個字符替換為一個或多個字符
vi替換使用規則:
:g/s1/s/s2/s3/g
第一個g表示對每一個包括s1的行都進行替換,第二個g表示對每一行包括s1的行所有的s2都用s3替換
s表示替換,s2是要被替換的字符串,他可以和s1相同(如果相同的話用//代替),s3是替換字符串
16.
fx
往右移動到 x 字符上
Fx
往左移動到 x 字符上
tx
往右移動到 x 字符前
Tx
往左移動到 x 字符後
(注意:以上四個命令中,其中x是鍵入的字符)
;
分號,配合 f 和 t 使用,重復一次
,
逗號,配合 f 和 t 使用,反方向重復一次
17. vi 環境選項 Solaris ksh
noautoindent nomodelines noshowmode
autoprint nonumber noslowopen
noautowrite nonovice tabstop=8
nobeautify nooptimize taglength=0
directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
noedcompatible prompt tagstack
noerrorbells noreadonly term=vt100
noexrc redraw noterse
flash remap timeout
hardtabs=8 report=5 ttytype=vt100
noignorecase scroll=11 warn
nolisp sections=NHSHH HUuhsh+c window=23
nolist shell=/bin/ksh wrapscan
magic shiftwidth=8 wrapmargin=0
mesg noshowmatch nowriteany
For C-Shell:
setenv EXINIT "set nu"
For Bourne or Korn Shell:
EXINIT="set nu"; export EXINIT
For Korn Shell Only (alternate method):
typeset -x EXINIT="set nu"
在 .profile 裡設置 vi 的環境選項 , 以上均
測試過
18.標記文本
mchar 用字母char標記當前光標的位置
`char 移至char所標記處
'char 移至char標記所在行的開頭處
" 移至當前行上一次所在位置(在光標移動之後)――一個雙引號
' 移至當前行上第一次所在位置的行的開頭處(在光標移動之後)――兩個單引號
19.
同時vi多個文件時,CTRL-SHIFT-6回到上一個文件,在本次vi的文件和上次vi的文件之間切換。
但是我發現一個BUG:在用CTRL-SHIFT-6切換到上一個文件後,用:args查看多文件vi狀態時,
屏幕底部仍然顯示目前vi的是剛才的文件。
(在HP-UX,Solaris,AIX上通過)
也可以使用:
:e#
進行切換
20.
sco 下VI 要在文本前同樣的字符加用
%s/^/要加的內容/g 要在文本後同樣的字符加
%s/$/要加的內容/g
21.
如何去掉文本中的 ^M 硬回車?不必用binary傳回去再ascii傳回來的方式,用shell或者unix語句實現。
cat filename |tr -d '\015' >newfile
不同的unix系統還存在一些其他不同的命令,如:doscp
sed 也可以實現這個功能.
dos2unix filename filename2
反之
unix2dos filename filename2
在vi 中用:$s/^M//g
^是crtl-V crtl-M
22.如何在“unix命令行”下將一個文件的某字符串用另一個串換掉
sed 's/string1/string2/gp' file1 > file2
23.將/etc/hosts下所有的地址都ping 2次
1 #/usr/bin/sh
2 #grad /etc/hosts and ping each address
3 cat /etc/hosts|grep -v '^#' | while read LINE
4 do
5 ADDR=`awk '{print $1}'`
6 for MACHINE in $ADDR
7 do
8 ping $MACHINE -n 2
9 done
10 done