sed
说明
摘录sed工具的使用
url:
http://blog.csdn.net/a81895898/article/details/8482387 http://coolshell.cn/articles/9104.html http://tsnc.zhongaokao.com/tsnc_wgrj/doc/sed.htm http://kodango.com/sed1line-notes
sed调试工具
sedsed
正则:
规则
^ 表示一行的开头 $ 表示一行的结尾 \< 表示词首。如\表示词尾。如\>abc表示以abc为尾的词 . 表示任意单个字符 * 表示某个字符出现了0次或多次 + 表示某个字符出现了1次或多次 [abc] 表示a或b或c字符 [^c] 表示非c的字符 & 表示被匹配的变量 \num 被匹配的第num个分组(\(...\)括起来的部分成为分组) e.g.
/[012]\{3\}/ ###< 三个数字 [012]{3} sed 's/xxx/[&]/g' my.txt ###< 匹配项加[] s/(ACTIVE_CONSOLES=/dev/tty\[1-)6]/\12]/ ###< ACTIVE_CONSOLES=/dev/tty[1-6] ###< -> ACTIVE_CONSOLES=/dev/tty[1-2]
工作形式
sed [option] script file script是由一条或多条指令(instruction)构成 指令由正则表达式(pattern)和编辑命令(action)构成
工作过程
以行为单位处理 每一行都是被读入到一块缓存空间,该空间名为模式空间(pattern space)
sed选项
-e:选项可选,在命令行中同时指定多个操作指令时用到
sed -e 's/x/y/' -e 's/y/x/' file sed 's/x/y/;s/y/x/' file-n:抑制默认输出(sed默认会把处理过的内容全输出)
sed 's/x/y/p' file 默认输出全部内容,等于把匹配的行输出两遍 sed -n 's/x/y/p' file 只打印匹配的行-i:对文件进行修改
默认不修改文件,输出到stdout 作用类似 sed "s/my/jphome's/g" pets.txt > pets.txt sed "s/my/jphome's/g" pets.txt ###< 输出文件到stdout,没有对文件进行修改
sed打印命令
# p:打印匹配行 (类似于grep) sed '/fish/p' my.txt /// 会输出所有 sed -n 'fish/p' my.txt /// 只打印匹配行 # =:打印行号 sed '/fish/=' my.txt # l:打印行,打印在模式空间中的行,同时显示控制字符
sed转换命令
# [address]y/SET1/SET2/ echo "hello world" | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' ###< -> HELLO WORLD sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file
sed编辑命令
# i:前面插入 # a:后面添加 # c:替换行 sed '1 i Insert' my.txt ###< 在第一行前插入一行xxx sed '$ a Append' my.txt ###< 在最后一行后添加一行xxx sed '/fish/a Append fish' my.txt ###< 在匹配到fish的那行后面插入一行xxx sed '2 c This is monkey' ###< 替换第二行为xxx sed "/fish/c this is monkey" ###< 替换匹配到fish的行 /fish/c\ ###< 支持多行 xxx\ ###< sed -i -f xxx.sed xxx.txt xxx # d:删除行 sed '/fish/d' my.txt /// 删除匹配到fish的一行 sed '2d' my.txt /// 删除第二行 sed '2,$d' my.txt /// 删除第二到最后一行 # s:匹配替换(s/xx/xx/) 单引号内无法使用转义符/ # 只替换每一行的第一个xx sed 's/xx/xx/1' # 只替换每一行的第二个xx sed 's/xx/xx/2 # 只替换每一行的第三个以后的xx sed 's/xx/xx/3g' # 替换每一行的所有匹配 sed 's/xx/XX/g' # r: 将文件内容读入匹配行后面 # sed会把r后面的任何字符判断为文件名,直到回车或单引号,所以不能用;来连接其他语句 sed '/pattern/r file1' file ###< 将file1文件的内容添加到匹配行后面 sed '/pattern/{r file1' -e other cmd} file sed '/pattern/{r file1 other cmd }' file # w: 将匹配到的内容写到文件 sed '/pattern/w file1' file
保持空间
# 小写覆盖、大写追加(追加内容与原内容以\n分隔) h/H 将模式空间的内容复制/者追加到保持空间 g/G 将保持空间的内容复制/者追加到模式空间 x 交换模式空间和保持空间的内容
其他
!
表示后面的命令对所有没有被选定的行发生作用 /pattern/!{}把12,34,56…行当成同一行来匹配
sed 'N;s/\n//' my.txt ###< 就是把12,34,56...合并成一行修改指定行
sed '3s/xx/xx/g' pets.txt ###< 第3行 sed '3,6s/xx/xx/g' pets.txt ###< 第3~6行 sed '1,${/this/d;s/^ *//g}' pets.txt在sed语句内使用变量
sed -i 's/^xxx/xx=`$DIR`/' xxx.file条件正则
sed '/^#define/{s/ //g}'n: 读取下一个输入行,用下一个命令处理新的行
/.H1/{n;/^$/d} ###< 删除.H1之后的第一个空行
例子
# 去除html文件中的tags sed 's/<[^>]*>//g' index.html > index.html # 行首加# sed 's/^/#/g' pets.txt # 行尾加 --- sed 's/$/ ---/g' pets.txt # 使用逗号,拼接行 sed 'H;$!d;${x;s/^\n//;s/\n/,/g}' file # 命令打包 sed '4,6 {/This/{/fish/d}}' pets.txt