关于sed替换的一点自我体会(转载)

xiaoxiao2022-06-12  35

www.lupaworld.com/bbs/viewthread.php ################################################################ #[0]:基础 # ################################################################ **sed执行过程: a. 如果已到达文件尾,goto e;否则,用当前行内容替换模式空间的内容(即缓冲区,还有一个缓冲区:后备空间); b. 执行命令序列,命令只对模式空间有效; c. 当前行号加1 d. goto a; e. 退出 注: 当前行号可由命令N或n更改,当前行号最初为第1行 执行命令时,如果该命令有地址前缀,那么看*当前行号*是否与地址前缀相符,相符则执行,否则不执行 例子: $sed -e 'p;p;i \ my-inserted-text p; a \ my-appended-text p;' filename 这个例子中有6条命令:4个p命令,1个i命令,1个a命令; $sed -e '2p;3,5p;6~10i \ my-inserted-text p; 7a \ my-appended-text /AA/p;' filename 这个例子类似上个,仅加入了地址前缀 ((详情请参考下文)) **常用方法: 命令: sed 'commands' targetfile echo "string" |sed 'commands' 脚本: #!/bin/sed -f command1 command2 ... **选项: -V --version 提示版本信息 -h --help 提示帮助信息 -n --quite --silent 默认情形,sed在执行完用户提交的命令列表后,会执行p命令,这3个选项能屏蔽这个默认功能 -e --exception=scrīpt 增加scrīpt命令列表到当前命令列表 -f --file=scrīpt-file 增加scrīpt-file文件内的命令列表到当前命令列表 初始时,当前命令列表为空;如果没有-e,--exception,-f,--file选项,那么命令行的第一个非选项参数被 当作命令列表添加到当前命令列表中 **常见命令: 可带范围地址前缀的命令(11个): d 删除模式空间的内容,goto c D 删除模式空间内的第一行,如果模式空间内还有内容,goto b,否则,goto c p 将模式空间中的内容输出到标准输出 P 将模式空间中的第一行内容输出到标准输出 N 读入下一行,将其*追加*到模式空间尾,当前行号加1,如果没有可读的行了,goto e n 读入下一行,用它*替换*模式空间内容,当前行好加1,如果没有可读的行了,goto e h 用模式空间内容*替换*后备空间内容 H 将模式空键内容*追加*到后备空间尾 g/G 同h/H,但方向相反,后备空间->模式空间 x 交换模式空间和后备空间内容 l 输出模式空间内容到标准输出,以更人性话的方式输出 例子: $echo -ne "AA BBBB\nCCCDDDD\nFDSAFDSA\n"|sed -n 'l' AA BBBB$ CCCDDDD$ FDSAFDSA$ { 命令块的开始,以 } 结束 b label 跳转到标签label处,如同c语言的goto语句 t label 从最近一次从标准输入读入一行开始 到 现在,如果执行了替换命令,且替换成功了, 那么跳转到label处,继续执行;否则执行下一条命令. 相当于条件跳转 s/regexp/replacement/ 对模式空间内容进行替换,只替换与regexp匹配的部分; 只对第一次匹配的进行替换 s/regexp/replacement/g 对模式空间内容 对模式空间内容进行全局替换 y/source/dest/ 逐个字符替换,其中source的长度必须与dest相等 如:source为ABC,dest为abc,那么模式空间内的所有A字符被换成a,B换成b,C换成c 以最后一对替换为标准, 如:source为ABA,dest为abc,那么模式空间内的所有A字符被换成c(而不是a),B换成b 例子: $echo ABCD |sed -n 'y/ABA/abc/;p' cbCD w file 把模式空间的内容写到file文件内 sed在它开始执行前,如果在当前命令序列中发现了这条命令,先将文件file清空(如果存在的话;不存在则创建), 之后所有的写入都是被追加到文件file尾 不带地址前缀的命令(3个): #comments 注释 : label 设置标签 } 与}匹配 最多能带一个地址的命令(5个): = 输出当前行号到标准输出 a \ text 执行完所有命令后,输出text到标准输出 i \ text 输出text到标准输出 q 如果没有 -n 选项,则goto e;否则,先输出模式空间内容到标准输出,然后goto e; r file file表示一个文件,如果这是最后一条命令,则输出文件file的内容到标准输出,然后goto c; 否则,goto c; **地址格式(数字代表行号,从1开始): 例子: 单地址: 1 第一行 /string/ 与string匹配的行 $ 最后一行 范围地址: 单地址,单地址 例子: 1,2 或 1~2 1,$所有行 多行: /regexp/ 代表与正则表达式regexp匹配的行 \cregexpc 代表与正则表达式regexp匹配的行,其中c可为任意字符 **带地址前缀的命令: 例子: 1p 1,3p 或 1~3p ################################################################ #[1]:元字符 * + ? { } ( )< > # ################################################################ * 在当前模式内*前有匹配字符时,表示个数(>=0个); 例子: $echo 'aaabbbbcdddd' |sed 's/\(a*\)/|\1|/' |aaa|bbbbcdddd * 在当前模式内*前无匹配字符时,表示字符'*'; 例子: $echo 'a*abbbbcdddd' |sed 's/a\(*\)/|\1|/' |*|abbbbcdddd $echo 'a*abbbbcdddd' |sed 's/*/|z|/' a|z|abbbbcdddd \* 表示字符'*'; 例子: $echo 'a*abbbbcdddd' |sed 's/\(a\*\)/|\1|/' |a*|abbbbcdddd ? 表示字符'?'; 例子: $echo 'a?abbbbcdddd' |sed 's/?/|z|/' a|z|abbbbcdddd \? 在当前模式内?前有匹配字符时,表示个数(0或者1个); 例子: $echo 'aa?bbbbcdddd' |sed 's/\(a\?\)/|\1|/' |a|a?bbbbcdddd \? 在当前模式内?前无匹配字符时,表示字符'?'; 例子: $echo 'aa?bbbbcdddd' |sed 's/\(\?\)/|\1|/' aa|?|bbbbcdddd + \+ 的意义类似 ? \?,只不过表示数字时为>=1个 { 表示字符'{' } 表示字符'}' \{ \} 用于表示出现次数,出现\{时,必须出现\}. 单个\}出现时,表示字符'}' 例子: $echo '({(aabbb}d' |sed 's/b\{1,\}\}/|z|/' ({(aa|z|d 成对\{ \}的3种格式: \{1\} \{1,\} \{1,9\}, 如上例 ( 表示字符'(' ) 表示字符')' \( \) 必须成对出现,表示子模式 例子: $echo 'a*abbbbcdddd' |sed 's/\(a\*\)/|\1|/' |a*|abbbbcdddd \< \> 表示完全匹配一个单词 [zleil@ZLEIL shApp]$ echo "abc" | sed '/b/s/\<ab\>/AB/g' abc [zleil@ZLEIL shApp]$ echo "ab c" | sed '/b/s/\<ab\>/AB/g' AB c < > 表示普通字符 < > **关于label的例子 这有几个关于label的例子, [zleil@ZLEIL shApp]$ echo "aBBbc" | sed -n 'p;b label;p;:label;p'; aBBbc aBBbc [zleil@ZLEIL shApp]$ echo "aBBbc" | sed -n 's/B/k/;t label;p;:label;p'; akBbc [zleil@ZLEIL shApp]$ echo "aBBbc" | sed -n 's/D/k/;t label;p;:label;p'; aBBbc aBBbc 相关资源:敏捷开发V1.0.pptx
转载请注明原文地址: https://www.6miu.com/read-4933574.html

最新回复(0)