“Linux-2020-spring-4-15”的版本间的差异

来自SUDA-HLT
跳到导航 跳到搜索
(创建页面,内容为“== 复习 及 vi中的正则表达式 == * vi中支持基本的正则表达式语法 vi中查找:$vim a.txt ; /std (查找) :s...”)
 
 
(未显示同一用户的7个中间版本)
第1行: 第1行:
 
== 复习 及 vi中的正则表达式 ==
 
== 复习 及 vi中的正则表达式 ==
  
−
* vi中支持基本的正则表达式语法
+
* vi中的查找
−
   vi中查找:$vim a.txt ; 
+
   末行模式下,输入"/"做forward查找,"?"表示backward查找;进而输入n表示next,N表示previous
−
            /std (查找)
+
  /std # 查找字符串"std"
 +
 +
* vi中的替换(末行模式下)
 +
    "/"是定界符(delimiter)
 +
    定界符不一定是"/",还可以是其他字符,如"%"等。
 +
    "|"不可以作为定界符,因为它是个RE元字符
 
             :s/std/stdin/(当前行的第一个std替换成stdin)   
 
             :s/std/stdin/(当前行的第一个std替换成stdin)   
−
             :s/std/stdin/g(当前行std全局替换成stdin,第一个/是定界符)   
+
             :s/std/stdin/g(当前行std全局替换成stdin)   
 
             :%s/std/stdin/(所有行的第一个std替换成stdin)  
 
             :%s/std/stdin/(所有行的第一个std替换成stdin)  
 
             :%s/std/stdin/g(所有行std全局替换成stdin,第一个/是定界符) 等价于:0,$s/std/stdin/g
 
             :%s/std/stdin/g(所有行std全局替换成stdin,第一个/是定界符) 等价于:0,$s/std/stdin/g
 
             :s/std/stdin/3(当前行开始3行的第一个std替换成stdin)   
 
             :s/std/stdin/3(当前行开始3行的第一个std替换成stdin)   
 
             :s/std/stdin/g3(当前行开始3行的std全局替换成stdin)
 
             :s/std/stdin/g3(当前行开始3行的std全局替换成stdin)
−
             :26s/std/stdin/g(26行std全局替换成stdin,第一个/是定界符)
+
             :26s/std/stdin/g(26行std全局替换成stdin)
−
             :23,26s/std/stdin/g(23到26行std全局替换成stdin,第一个/是定界符)
+
             :23,26s/std/stdin/g(23到26行std全局替换成stdin)
−
             :.,$s/std/stdin/g(当前行到文章末尾std全局替换成stdin,第一个/是定界符)
+
             :.,$s/std/stdin/g(当前行到文章末尾std全局替换成stdin)
 
             :.,.+3s/std/stdin/g(当前行开始3行std全局替换成stdin)
 
             :.,.+3s/std/stdin/g(当前行开始3行std全局替换成stdin)
 
             :s/std[inout]*/(&)/g2(当前行开始2行stdin或者stdout全局替换成加括号的stdin和stdout)
 
             :s/std[inout]*/(&)/g2(当前行开始2行stdin或者stdout全局替换成加括号的stdin和stdout)
 +
 +
* vi默认支持基本的正则表达式语法,使用起来相对复杂,要加很多backslash
 +
  /a\|b
 +
  /[a-f]\+
 +
  基本正则表达式语法和扩展语法是一致的,只是写起来复杂或简单。
 +
 +
* vi中的删除(末行模式下)
 
             :15,20d(删除15到20行)
 
             :15,20d(删除15到20行)
 
             :0,.d(删除零到当前行)
 
             :0,.d(删除零到当前行)
 +
 +
* vi中u和r我总是搞不清楚,得在讲义中搞清楚
 +
  
 
* 正则表达式复习
 
* 正则表达式复习
 
   .
 
   .
 
   []  
 
   []  
−
  [a-Z]:字符类(集合),只能匹配一个字符
+
   [0-9]:等价于\d(预定义字符类)等价于[ [:digit:]]
−
   [0-9]等价于\d(预定义字符类)等价于[[:digit:]]
 
 
   [^]
 
   [^]
−
   [ \t\r\n]:空白符(空格,tab,回车)等价于\s等价于[[:space:]]
+
   [ \t\r\n\f\v](这么写的字符类可能不行,没法匹配): 空白符(空格,tab,回车等)等价于\s;等价于[ [:space:]]
 
   *
 
   *
 
   ?
 
   ?
第31行: 第45行:
 
   &
 
   &
  
−
== sed (stream editor) ==
+
== sed (stream editor) ==  
−
    
+
* 语法:sed [opt] 'cmd' file
−
   语法sed [opt] "cmd" file
+
* 功能:不打开文件,以行为单位,直接对文件进行编辑
 +
* 和vi的区别:vi需要打开文件,显示到屏幕上,以可见的方式进行编辑。
 +
* 问题:sed和vi编辑文件时,各自的优点在哪?
 +
 
 +
* 替换:substitute
 +
** 定界符不一定是'/',还可以是'#'等
 +
** -i选项(in-place,就地)
 +
   sed 's/std/stdin/g' main.txt > main.2.txt :main.txt内容不变,定界符还可以为#
 +
  sed -i 's/std/stdin/g' main.txt :会直接修改main.txt中的内容
 +
 
 +
* 一些高级用法
 +
** -r选项:表示支持扩展RE语法,推荐使用时都加上
 +
   sed -r 's/^([0-9]*)([/t ]*)([^/t ]*)/\3\2\1/' main.txt :(第一个^表示一行的开始,\1表示第一分组(括号)匹配的内容)
 +
  sed -r 's/^(([0-9]*)([/t ]*)([^/t ]*))/\4\3\2/' main.txt :分组按照左括号开始匹配内容
 +
  sed -r 's/std[inout]*/(&)/g' main.2.txt
 +
  sed -r '5,10s/std[inout]*/(&)/g' main.2.txt (只处理第5行到第10行)
  
−
  编辑 ----vim 打开文件替换
+
* 删除
−
        ----sed:不用打开文件
+
** 注意指定行号时,没有当前行'.'的概念     
−
            sed 's/std/stdin/g' main.txt > main.2.txt :main.txt内容不变,定界符还可以为#
+
  sed '2,$d' main.txt            
−
            sed -i 's/std/stdin/g' main.2.txt :会替换掉main.2.txt中的内容
+
  sed '/^std/d' main.txt 删除以std开头的行
  
−
            sed  -r 's/^([0-9]*)([/t ]*)([^/t ]*)/\3\2\1/' main.txt :(第一个^表示一行的开始,\1表示第一分组(括号)匹配的内容)
 
−
            sed  -r 's/^(([0-9]*)([/t ]*)([^/t ]*))/\4\3\2/' main.txt :分组按照左括号开始匹配内容
 
−
            sed -r 's/std[inout]*/(&)/g' main.2.txt
 
  
−
  删除      sed '2,&d' main.txt
+
sed -e 's/Tom/tom/' -e 's/is/IS/' a.txt
−
              sed '/^std/d' main.txt 删除以std开头的行
+
sed 's/Tom/tom/;s/is/IS/' a.txt
 +
sed -e 's/Tom/tom/;s/is/IS/' a.txt
 +
上面三个是等价的
 +
-e的含义是:后面的参数时一个命令(script;command)

2021年11月20日 (六) 04:04的最新版本

复习 及 vi中的正则表达式

  • vi中的查找
  末行模式下,输入"/"做forward查找,"?"表示backward查找;进而输入n表示next,N表示previous
  /std # 查找字符串"std" 

  • vi中的替换(末行模式下)
   "/"是定界符(delimiter)
   定界符不一定是"/",还可以是其他字符,如"%"等。
   "|"不可以作为定界符,因为它是个RE元字符
            :s/std/stdin/(当前行的第一个std替换成stdin)   
            :s/std/stdin/g(当前行std全局替换成stdin)   
            :%s/std/stdin/(所有行的第一个std替换成stdin) 
            :%s/std/stdin/g(所有行std全局替换成stdin,第一个/是定界符) 等价于:0,$s/std/stdin/g
            :s/std/stdin/3(当前行开始3行的第一个std替换成stdin)   
            :s/std/stdin/g3(当前行开始3行的std全局替换成stdin)
            :26s/std/stdin/g(26行std全局替换成stdin)
            :23,26s/std/stdin/g(23到26行std全局替换成stdin)
            :.,$s/std/stdin/g(当前行到文章末尾std全局替换成stdin)
            :.,.+3s/std/stdin/g(当前行开始3行std全局替换成stdin)
            :s/std[inout]*/(&)/g2(当前行开始2行stdin或者stdout全局替换成加括号的stdin和stdout)
  • vi默认支持基本的正则表达式语法,使用起来相对复杂,要加很多backslash
 /a\|b
 /[a-f]\+
 基本正则表达式语法和扩展语法是一致的,只是写起来复杂或简单。
  • vi中的删除(末行模式下)
            :15,20d(删除15到20行)
            :0,.d(删除零到当前行)
  • vi中u和r我总是搞不清楚,得在讲义中搞清楚


  • 正则表达式复习
 .
 [] 
 [0-9]:等价于\d(预定义字符类)等价于[ [:digit:]]
 [^]
 [ \t\r\n\f\v](这么写的字符类可能不行,没法匹配): 空白符(空格,tab,回车等)等价于\s;等价于[ [:space:]]
 *
 ?
 {}
 ()
 &

sed (stream editor)

  • 语法:sed [opt] 'cmd' file
  • 功能:不打开文件,以行为单位,直接对文件进行编辑
  • 和vi的区别:vi需要打开文件,显示到屏幕上,以可见的方式进行编辑。
  • 问题:sed和vi编辑文件时,各自的优点在哪?
  • 替换:substitute
    • 定界符不一定是'/',还可以是'#'等
    • -i选项(in-place,就地)
  sed 's/std/stdin/g' main.txt > main.2.txt :main.txt内容不变,定界符还可以为#
  sed -i 's/std/stdin/g' main.txt :会直接修改main.txt中的内容 
  • 一些高级用法
    • -r选项:表示支持扩展RE语法,推荐使用时都加上
  sed -r 's/^([0-9]*)([/t ]*)([^/t ]*)/\3\2\1/' main.txt :(第一个^表示一行的开始,\1表示第一分组(括号)匹配的内容)
  sed -r 's/^(([0-9]*)([/t ]*)([^/t ]*))/\4\3\2/' main.txt :分组按照左括号开始匹配内容
  sed -r 's/std[inout]*/(&)/g' main.2.txt 
  sed -r '5,10s/std[inout]*/(&)/g' main.2.txt (只处理第5行到第10行)
  • 删除
    • 注意指定行号时,没有当前行'.'的概念
 sed '2,$d' main.txt              
 sed '/^std/d' main.txt 删除以std开头的行


sed -e 's/Tom/tom/' -e 's/is/IS/' a.txt
sed 's/Tom/tom/;s/is/IS/' a.txt
sed -e 's/Tom/tom/;s/is/IS/' a.txt
上面三个是等价的
-e的含义是:后面的参数时一个命令(script;command)