当前位置:   article > 正文

Shell sed命令_shell sed -n 8p

shell sed -n 8p

遇到sed问题,经常会去查资料,这里自己记录一下,方便以后查询。

sed(流编辑器)命令行文本编辑器。它一次处理一行内容,先把处理的行存入临时缓冲区(模式空间)进行处理,用sed命令处理缓冲区内容后输出到屏幕。能同时处理多个文件多行的内容,不改变原文件内容。最常用的是模式匹配和替换操作。

官网文档

 

命令格式 

  1. sed [选项]... {脚本} [输入文件]...
  2. sed [option] 'command' file
  3. sed [option] scriptfile file

选项说明

选项完整含义说明
-n--quiet, --silent取消自动打印,只输出sed处理的行
-e 脚本--expression=脚本添加“脚本”到程序的运行列表,允许对输入数据应用多条sed命令编辑
-f 脚本文件--file=脚本文件添加“脚本文件”到程序的运行列表
-l N--line-length=N指定“l”命令的换行长度
-r 或 -E--regexp-extended在脚本中使用扩展正则表达式
-s--separate将输入文件视为各个独立的文件而不是一个长的连续输入
-u--unbuffered从输入文件读取最少的数据,更频繁的刷新输出
-i--in-place[=SUFFIX]直接编辑源文件,而不是由屏幕输出。如果有后缀则备份
--help 打印帮助并退出
--version 输出版本信息并退出

退出码

编码解释
0执行完成
1错误命令、错误语法、错误正则表达式、使用了posix扩展命令
2部分文件无法打开(文件不存在、权限),其他文件继续处理
4

I/O错误、运行时错误

命令

命令说明
a\ text  /  a text(替代)追加,在行末追加文本
b label跳转到标签位置
c text行替换,用c后面的字符串替换原数据行
d  /  D删除行 / 删除模式空间第一行
ee command执行命令并替换模式空间内容
F打印文件名
g / G替换 / 追加 当前模式空间内容为内存缓冲区内容
h / H拷贝 / 追加 当前模式空间内容到内存中的缓冲区
i text插入,在行首插入文本
l列表打印模式空间内容
n / N读取 / 追加下一行
p / P打印匹配行
q[exit-code] / Q[exit-code]退出sed
r filename / R filename从文件中读入文本
s/regexp/replacement/[flags]字符串替换,格式:"行范围 s/旧字串/新字串/g",不加g只替换每行第一个匹配的串
t label / T label读取条件成功 / 失败后跳转到标签位置,标签可省略
w filename / W filename将匹配内容 / 第一行写入到文件
x交换模式空间和内存缓冲区内容
y/src/dst/替换单个字符
z清除模式空间内容
#注释,到换行符之前
{ cmd ; cmd ... }多个执行命令,分号分隔
=显示匹配行的行号
label指定跳转标签位置

s替换标记[flags]

编码解释
g替换全部
number只替换number行
p如果替换则打印
w

将替换的结果写入文件

\l子串匹配

扩展正则表达式

^

匹配行开始,如:/^sed/匹配所有以sed开头的行。

$

匹配行结束,如:/sed$/匹配所有以sed结尾的行。

^$

空白行

.

匹配任意单个非换行符字符

*

匹配相邻的字符任意次(0或多个)

.*

匹配任意长度的任意字符

\?

匹配紧挨在前面的字符0次或1次

x{m}

匹配重复字符x,m次,如:/0{5}/匹配包含5个0的行
x{m,}

匹配重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行

x{m,n}

匹配重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行

<

匹配单词的开始,如:/<love/匹配包含以love开头的单词的行

>

匹配单词的结束,如/love>/匹配包含以love结尾的单词的行

<pattern>

匹配单词

[]

匹配指定范围内的任意单个字符,如/[sS]ed/匹配sed和Sed

[^]

匹配不在指定范围内的任意单个字符

()匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。

[:digit:]

所有数字, 相当于0-9, [0-9]= [[:digit:]]

[:lower:]

所有的小写字母

[:upper:]

所有的大写字母

[:alpha:]

所有的字母

[:alnum:]

相当于0-9a-zA-Z

[:space:]

空白字符

[:punct:]

所有标点符号

示例

1、追加命令:a命令

sed '/^hello/a\\--->this is a example' sed.txt   
'--->this is a example'被追加到以hello开头的行(另起一行)后面,sed要求命令a后面有一个反斜杠

2、整行替换:c命令

sed '2c hello world' sed.txt   将第二行替换成hello world

3、删除:d命令

sed '2d' sed.txt     删除sed.txt文件的第二行
sed '2,$d' sed.txt   删除sed.txt文件的第二行到末尾所有行
sed '$d' sed.txt     删除sed.txt文件的最后一行
sed '/test/d ' sed.txt     删除sed.txt文件所有包含test的行
sed '/[A-Za-z]/d ' sed.txt   删除sed.txt文件所有包含字母的行

4、多点编辑:e命令

sed -e '1,5d' -e 's/hello/hi/' sed.txt      -e允许在同一行里执行多条命令。删除1至5行,并用hello替换hi
命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果

sed --expression='s/hello/hi/' --expression='/today/d' sed.txt      一个比-e更好的命令是--expression。它能给sed表达式赋值

5、插入:i命令

sed '/will/i\\some thing new -------' sed.txt      如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面

6、下一个:n命令

sed '/hello/{n; s/aa/bb/;}' sed.txt     替换下一行的第一个aa
sed '/hello/{n; s/aa/bb/g;}' sed.txt       替换下一行的全部aa
如果hello被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。

7、打印:p命令

sed -n '2,4p' wc.txt      只打印2,4行

8、退出:q命令

sed '10q' sed.txt
打印完第10行后,退出sed
同样的写法:
sed -n '1,10p ' sed.txt

9、字符串替换:s命令

sed '/today/,/hello/s/$/www/' sed.txt      对于模板today和hello之间的行,每行的末尾用字符串www替换
sed '/today/,/hello/s/^/www/' sed.txt      对于模板today和hello之间的行,每行的开头用字符串www替换
sed '/^[A-Za-z]/s/5/five/g' sed.txt      将以字母开头的行中的数字5替换成five

sed 's/hello/hi/g' sed.txt       在整行范围内把hello替换为hi。如果没有g标记,则只有每行第一个匹配的hello被替换成hi。
sed 's/hello/hi/2' sed.txt       只替换每行的第2个hello为hi
sed 's/hello/hi/2g' sed.txt      只替换每行的第2个以后的hello为hi(包括第2个)
sed -n 's/^hello/hi/p' sed.txt     -n和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的hello被替换成hi,就打印它
sed -n '2,4p' sed.txt      打印输出sed.txt中的第2行和第4行
sed -n 's/hello/&-hi/gp' sed.txt      &符号表示追加一个串到找到的串后
sed 's/^192.168.0.1/&-localhost/' sed.txt    所有以192.168.0.1开头的行都会被替换成它自已加 -localhost,变成192.168.0.1-localhost
sed 's/^192.168.0.1/[&]/' sed.txt     表示给IP地址添加中括号

sed 's#hello#hi#g' sed.txt      把所有hello替换成hi
不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,"#"在这里是分隔符,代替了默认的"/"分隔符

sed -n '/today/,/hello/p' sed.txt      所有在第一个today和第一个hello所确定的范围内的行都被打印
sed -n '5,/^hello/p' sed.txt      打印从第五行开始到第一个包含以hello开始的行之间的所有行
sed -n '/^hello/,8p' sed.txt      打印从第一个包含以hello开始的行到第8行之间的所有行

10、从文件读入:r命令

sed '/hello/r file' sed.txt
file里的内容被读进来,显示在与hello匹配的行下面,如果匹配多行,则file的内容将显示在所有匹配行的下面

11、写入文件:w命令

sed -n '/hello/w file' sed.txt      在sed.txt中所有包含hello的行都被写入file里

12、()\1...\n 保留

sed -n 's/liujinhe/\1zero/p' sed.txt      liu被标记为\1,所以liu会被保留下来(\1 == liu)
sed -n 's/liujiahe/\1zero\2ss/p' sed.txt      he被标记为\2,所以he也会被保留下来(\2 == he),所以最后的结果就是\1zero\2ss == "liu" + "zero" + "he" + "ss"
此处:\1代表的是被第一个()包含的内容,\2代表的是被第二个()包含的内容,……
上面命令的意思就是:被括号包含的字符串会保留下来,然后跟其他的字符串比如zero和ss组成新的字符串liuzerohess

13、其他

sed "s/$//;s/ *//g;/^$/d"
s/$//     $是最后。在每一行后面追加空。 s为搜索,如s/a/b/,搜索a将替换为b,并只替换一次。
s/ *//g   将空格删除。 g代表搜索到的全部替换。"空格*"即" *"代表多个空格。
/^$/d     删除空行。

echo "$HOSTLIST" | sed "s/#.*$//;/^$/d"
打印HOSTLIST,取出值。删除#开头的和空行。
s/#.*$//;  #开头的,替换为空。
/^$/d  删除空行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/323024
推荐阅读
相关标签
  

闽ICP备14008679号