您的位置:首页 > 其它

sed命令浅析

2016-03-23 23:19 197 查看
写在前面: 博客书写牢记5W1H法则:What,Why,When,Where,Who,How。本篇主要内容:● sed 命令用法sed
stream editor for filtering and transforming text
sed会将整行读取到模式空间(pattern space),在模式空间进行处理后,根据处理动作进行操作(默认输出),直到读取新的行,将模式空间的原有行覆盖,除非手动干预。而模式空间的内容也可以转移到保留空间,保留空间可以保留更多行,以供其他操作。
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
OPTION
-n, --quiet, --silent:取消默认的打印行为
-e script, --expression=script:指定一个新的表达式,可以有多个同时使用
-f script-file, --file=script-file:指定脚本文件
-i[SUFFIX], --in-place[=SUFFIX]:直接修改原文件内容
-c, --copy:与-i一起使用,修改原文件的同时,将未修改的文件复制一份并命名为“原文件名+c”
-r, --regexp-extended:支持正则表达式
-z, --null-data:以空字符(null)分割行。可以指定此选项,来保证只处理第一个找到的行

script:
[地址定界] [字符处理或整行处理]
中间以空格隔开,可以多个空格
地址定界:
空:每一行
#:指定某行
#,#...:指定某几行
#,+#:从第#行开始的,往后#行
$:最后一行
1~2:从第1行开始,步进为2。即所有奇数行
5,~3 :从第5行开始,直到3的第一个整数倍的行停止
/regexp/ 或 \0regexp0:正则表达式匹配的行,"0"也可替换为其他字符
#,/PAT1/:从第#行开始,知道匹配到PAT1的行
/PAT1/,/PAT2/:从匹配到PAT1的行开始,到匹配到PAT2的行结束
整行处理:
仅对匹配空间的行进行处理操作。
= :显示行号。会在行的前面新建一行行号
a \TEXT :在匹配到的行的下方插入一行,内容为TEXT。"/"标记TEXT的开头。
i \ :在匹配到的行的上方插入一行,内容为TEXT。"/"标记TEXT的开头。
q [退出码] :执行完本行处理后立即退出。如果给出退出码,则将退出码设置为指定退出码。
Q [退出码] :不执行本行处理,直接退出。如果给出退出码,则将退出码设置为指定退出码。
r FILENAME :读取FILENAME的内容,并插入到匹配行的行后
R FILENAME :读取FILENAME的内容,并一行行插入到匹配行的行后。如第1个匹配到的行的行后只会插入文件的第1行,第2个匹配到的行行后插入文件的第2行。

c \TEXT :替换匹配行的内容为TEXT
d :删除匹配到的行
h H :读取/追加模式空间内容到保留空间
g G :读取/追加保留空间内容到模式空间
n N :读取/追加下一行到模式空间
p :打印当前模式空间内容

w filename :将模式空间内容另存为filename文件

字符处理:
s/regexp/replacement/ :替换匹配到的行的指定字符串
y/source/dest/ :单字符替换
实例:
-z选项用法:
(一)
[root@localhost ~]# echo -e "hello fred\nhello" | sed  "s:hello:222:"
222 fred
222
[root@localhost ~]# echo -e "hello fred\nhello" | sed -z "s:hello:222:"
222 fred
hello
(二)
[root@localhost ~]# cat t.txt
123
skldfjksladfjsdf
123111111111
[root@localhost ~]# sed "s:123:tttttttttttt:" t.txt
tttttttttttt
skldfjksladfjsdf
tttttttttttt111111111
[root@localhost ~]# sed -z "s:123:tttttttttttt:" t.txt
tttttttttttt
skldfjksladfjsdf
123111111111


#为每一行行后都添加一行
[root@www ~]# cat test.txt
1 23
123456
124356
echo123
[root@www ~]# sed 'a             new line' test.txt
1 23
new line
123456
new line
124356
new line
echo123
new line
[root@www ~]# sed 'a    \   new line' test.txt
1 23
new line
123456
new line
124356
new line
echo123
new line


#查找特定行并指定退出码退出
[root@www ~]# sed '/^123/q4' test.txt
1 23
123456
[root@www ~]# echo $?
4
[root@www ~]# sed '/^123/Q18' test.txt
1 23
[root@www ~]# echo $?
18


#将file的内容追加到test.txt的尾部
[root@www ~]# cat > file << eof
> this is line1.
> eof
[root@www ~]# sed '$rfile' test.txt
1 23
123456
124356
echo123
this is line1.


#获取"ip addr show"的输出,并用sed得到IP和掩码
[root@www ~]# ip addr show > ipinfo
[root@www ~]# sed -n '/[[:space:]]\+inet /s:[^0-9]*\([0-9.]\+\/[0-9]\+\).*:\1:p' ipinfo
127.0.0.1/8
172.18.31.7/16
172.18.252.42/16


#高级用法实例
sed  -n  'n;p'  FILE     #显示偶数行;
sed  '1!G;h;$!d'  FILE     #逆序显示文件的内容;
sed  ’$!d'  FILE     #取出最后一行;
sed  '$!N;$!D' FILE     #取出文件后两行;
sed '/^$/d;G' FILE     #删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed  'n;d'  FILE     #显示奇数行;
sed 'G' FILE     #在原有的每行后方添加一个空白行;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sed