“Linux-2020-spring-4-15”的版本间的差异
跳到导航
跳到搜索
| (未显示同一用户的6个中间版本) | |||
| 第6行: | 第6行: | ||
* vi中的替换(末行模式下) | * vi中的替换(末行模式下) | ||
| + | "/"是定界符(delimiter) | ||
| + | 定界符不一定是"/",还可以是其他字符,如"%"等。 | ||
| + | "|"不可以作为定界符,因为它是个RE元字符 | ||
:s/std/stdin/(当前行的第一个std替换成stdin) | :s/std/stdin/(当前行的第一个std替换成stdin) | ||
| − | :s/std/stdin/g( | + | :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( | + | :26s/std/stdin/g(26行std全局替换成stdin) |
| − | :23,26s/std/stdin/g( | + | :23,26s/std/stdin/g(23到26行std全局替换成stdin) |
| − | :.,$s/std/stdin/g( | + | :.,$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中的删除(末行模式下) | * vi中的删除(末行模式下) | ||
:15,20d(删除15到20行) | :15,20d(删除15到20行) | ||
:0,.d(删除零到当前行) | :0,.d(删除零到当前行) | ||
| + | |||
| + | * vi中u和r我总是搞不清楚,得在讲义中搞清楚 | ||
| + | |||
* 正则表达式复习 | * 正则表达式复习 | ||
. | . | ||
[] | [] | ||
| − | + | [0-9]:等价于\d(预定义字符类)等价于[ [:digit:]] | |
| − | [0-9] | ||
[^] | [^] | ||
| − | [ \t\r\n]: | + | [ \t\r\n\f\v](这么写的字符类可能不行,没法匹配): 空白符(空格,tab,回车等)等价于\s;等价于[ [:space:]] |
* | * | ||
? | ? | ||
| 第35行: | 第45行: | ||
& | & | ||
| − | == sed (stream editor) == | + | == 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) | ||
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)