sed脚本
A. sed -e脚本参数求解
man sed,帮忙里其实都有说的。
sed内部有两个空间,模式空间和保留空间。
模式空间是对外用的,用于读取外部文件;保留空间是内部用的,用于暂存文本数据。
常规处理只用到模式空间,sed将文件以行为单位读入模式空间内处理即可。
但有时在读取后面的内容时需要保留上文,就可以将上文内容暂存在保留空间内,需要时再取回来。因此,sed提供了一些命令用于在这两个空间之间交换数据。
g 拷贝保留空间的内容到模式空间(覆盖写方式)
G 将保留空间的内容附加到模式空间已有内容的后面(以换行符'\n'分隔)
p 打印模式空间的当前内容
h 拷贝模式空间的内容到保留空间(覆盖写方式)
x 交换模式空间与保留空间的内容
这样看看,你是否能明白些呢?
B. 运行一个自己写的sed脚本,为什么出现了乱码,即使代码有错也不应这样啊,查看一下编码情况,要改吗
sh -x ./append1.sed input
看看过程是哪有问题
file ./append1.sed 看看和其他正常文件的区别
vim状态在./append1.sed 里面执行:set fileformat=unix
C. linux sed 一个脚本删除文件后10行
是文件/etc/passwd的行数, 从文件11行开始,读出一条,就要删除模式空间的一行,这样模式里面才只有10行记录,如果只写成11D,那么当读出文件的行号为11时,模式才删一行记录
D. linux之文本内容替换命令sed
sed简介:流编辑工具,用来对文本进行过滤与替换操作。
sed流程:sed通过一次仅读取一行内容来对某些指令进行处理后输出。
1、sed通过文件或管道读取文件内容,但sed默认并不直接修改源文件,而是将读入的内容复制到缓冲区中,称之为模式空间。
2、所有的指令操作都是在模式空间找那个进行
3、sed根据相应的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出(即屏幕上)。
sed基本语法格式:
用法:sed[选项]...{脚本指令}[输入文件]...
选项: -version 显示sed版本
-help :显示帮助文档
-n,-quiet,-silent静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容。
-e script允许多个脚本指令被执行
-f script-file从文件中读取脚本指令,对编写自动化脚本程序很实用
-i ,-in-place 该选项直接修改源文件
-l N 该选项指定l指令可以输出的行长度,l指令为输出非打印字符。
-posix 禁用GNU sed扩展功能。
-r 在脚本指令中使用扩展正则表达式。
-s,-separate 默认情况下,sed将把输入的多个文件名作为一个长的连续的输入流。而GNU sed则允许把它们当作单独的文件。
-u,-unbuffered 最低限度的缓存输入与输出
a,append表示追加指令;
i,insert表示插入指令;
d,delete表示删除指令;
s,substitution表示替换指令。
sed脚本指令的基本格式是:
[地址,即路径]命令(有些命令仅可以对一行操作,有些可以对多行操作),命令也可以用花括号进行组合,使命令序列可以作用于同一个地址。
address{
command1
command2
command3
}
sed的基本工作方式是:
sed的替换命令s:
1、全局替换 : s/old/new/g ,其中g为全局替换,用于替换所有出现的次数; /如果和正则匹配的内容冲突可以使用其他符号,如 : s@old@new@g
2、标志位
为什么要有多行模式: 配置文件一般有单行出现,但也有使用json或XML格式的配置文件,为多行出现。
多行模式处理命令N、D、P
E. Shell基本脚本命令使用教程
1、本地变量:用户私有变量,只有本用户可以访问,保存在家目录的 .bash_profile、.bashrc文件中
2、全局变量:所有用户都可以使用,保存在 /etc/profile 文件中
3、用户自定义变量:用户自定义,比如脚本中的变量
定义变量格式: 变量名=值 (=两边不能有空格)
字符串用单引号或者双引号引起来
shell支持正则表达式的常见命令:grep、sed、awk。
sed 是一个行(流)编辑器,非交互式的对文件内容进行增删改查操作
awk 能够集过滤、提取、运算为一体,它的工作方式是读取数据,将每一行数据视为一条记录,每条记录以字段分隔符分成若干字段,然后输出各个字段的值。平行命令还有 gawk、pgawk、dgawk。
F. SED的小技巧
在sed的命令行中引用shell变量时要使用双引号,而不是通常所用的单引号。下面是一个根据name变量的内容来删除named.conf文件中zone段的脚本:
name='zone localhost'sed /$name/,/};/d named.conf
文本间隔
--------
# 在每一行后面增加一空行
sed G
# 将原来的所有空行删除并在每一行后面增加一空行。这样在输出的文本中每一行后面将有且只有一空行。
sed '/^$/d;G'
# 在每一行后面增加两行空行
sed 'G;G'
# 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
sed 'n;d'
# 在匹配式样“regex”的行之前插入一空行
sed '/regex/{x;p;x;}'
# 在匹配式样“regex”的行之后插入一空行
sed '/regex/G'
# 在匹配式样“regex”的行之前和之后各插入一空行
sed '/regex/{x;p;x;G;}'
编号
--------
# 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符”(tab,见本文末尾关于' '的用法的描述)而不是空格来对齐边缘。
sed = filename | sed 'N;s/
/ /'
# 对文件中的所有行编号(行号在左,文字右端对齐)。
sed = filename | sed 'N; s/^/ /; s/ *(.{6,})
/1 /'
# 对文件中的所有行编号,但只显示非空白行的行号。
sed '/./=' filename | sed '/./N; s/
/ /'
# 计算行数 (模拟 wc -l)
sed -n '$='
文本转换和替代
--------
# Unix环境:转换DOS的新行符(CR/LF)为Unix格式。
sed 's/.$//' # 假设所有行以CR/LF结束
sed 's/^M$//' # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
sed 's/x0D$//' # ssed、gsed 3.02.80,及更高版本
# Unix环境:转换Unix的新行符(LF)为DOS格式。
sed s/$/`echo -e \
`/ # 在ksh下所使用的命令
sed 's/$'/`echo \
`/ # 在bash下所使用的命令
sed s/$/`echo \
`/ # 在zsh下所使用的命令
sed 's/$/
/' # gsed 3.02.80 及更高版本
# DOS环境:转换Unix新行符(LF)为DOS格式。
sed s/$// # 方法 1
sed -n p # 方法 2
# DOS环境:转换DOS新行符(CR/LF)为Unix格式。
# 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的。sed可以通过其特有的“--text”选项。你可以使用帮助选项(“--help”)看其中有无一个“--text”项以此来判断所使用的是否是UnxUtils版本。其它DOS版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。
sed s/
// infile >outfile # UnxUtils sed v4.0.7 或更高版本
tr -d
<infile >outfile # GNU tr 1.22 或更高版本
# 将每一行前导的“空白字符”(空格,制表符)删除使之左对齐
sed 's/^[ ]*// #见本文末尾关于' '用法的描述
# 将每一行拖尾的“空白字符”(空格,制表符)删除
sed 's/[ ]*$//' # 见本文末尾关于' '用法的描述
# 将每一行中的前导和拖尾的空白字符删除
sed 's/^[ ]*//;s/[ ]*$//'
# 在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
sed 's/^/ /'
# 以79个字符为宽度,将所有文本右对齐
sed -e :a -e 's/^.{1,78}$/ &/;ta' # 78个字符外加最后的一个空格
# 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前头和后头都填充了空格。在方法2中,在居中文本的过程中只在文本的前面填充空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
sed -e :a -e 's/^.{1,77}$/ & /;ta' # 方法1
sed -e :a -e 's/^.{1,77}$/ &/;ta' -e 's/(*)1/1/' # 方法2
# 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”
sed 's/foo/bar/' # 只替换每一行中的第一个“foo”字串
sed 's/foo/bar/4' # 只替换每一行中的第四个“foo”字串
sed 's/foo/bar/g' # 将每一行中的所有“foo”都换成“bar”
sed 's/(.*)foo(.*foo)/1bar2/' # 替换倒数第二个“foo”
sed 's/(.*)foo/1bar/' # 替换最后一个“foo”
# 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
sed '/baz/s/foo/bar/g'
# 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换
sed '/baz/!s/foo/bar/g'
# 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #对多数的sed都有效
gsed 's/scarlet|ruby|puce/red/g' # 只对GNU sed有效
# 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。
# 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除
sed '1!G;h;$!d' # 方法1
sed -n '1!G;h;$p' # 方法2
# 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”)
sed '/
/!G;s/(.)(.*
)/&21/;//D;s/.//'
# 将每两行连接成一行(类似“paste”)
sed '$!N;s/
/ /'
# 如果当前行以反斜杠“”结束,则将下一行并到当前行末尾并去掉原来行尾的反斜杠
sed -e :a -e '/\$/N; s/\
//; ta'
# 如果当前行以等号开头,将当前行并到上一行末尾并以单个空格代替原来行头的“=”
sed -e :a -e '$!N;s/
=/ /;ta' -e 'P;D'
# 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567”
gsed ':a;s/B[0-9]{3}>/,&/;ta' # GNU sed
sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta' # 其他sed
# 为带有小数点和负号的数值增加逗号分隔符(GNU sed)
gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9])/12,3/g;ta'
# 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
gsed '0~5G' # 只对GNU sed有效
sed 'n;n;n;n;G;' # 其他sed
选择性地显示特定行
--------
# 显示文件中的前10行 (模拟“head”的行为)
sed 10q
# 显示文件中的第一行 (模拟“head -1”命令)
sed q
# 显示文件中的最后10行 (模拟“tail”)
sed -e :a -e '$q;N;11,$D;ba'
# 显示文件中的最后2行(模拟“tail -2”命令)
sed '$!N;$!D'
# 显示文件中的最后一行(模拟“tail -1”)
sed '$!d' # 方法1
sed -n '$p' # 方法2
# 显示文件中的倒数第二行
sed -e '$!{h;d;}' -e x # 当文件中只有一行时,输入空行
sed -e '1{$q;}' -e '$!{h;d;}' -e x # 当文件中只有一行时,显示该行
sed -e '1{$d;}' -e '$!{h;d;}' -e x # 当文件中只有一行时,不输出
# 只显示匹配正则表达式的行(模拟“grep”)
sed -n '/regexp/p' # 方法1
sed '/regexp/!d' # 方法2
# 只显示“不”匹配正则表达式的行(模拟“grep -v”)
sed -n '/regexp/!p' # 方法1,与前面的命令相对应
sed '/regexp/d' # 方法2,类似的语法
# 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
sed -n '/regexp/{g;1!p;};h'
# 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行
sed -n '/regexp/{n;p;}'
# 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所
# 在行的行号 (类似“grep -A1 -B1”)
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
# 显示包含“AAA”、“BBB”或“CCC”的行(任意次序)
sed '/AAA/!d; /BBB/!d; /CCC/!d' # 字串的次序不影响结果
# 显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
sed '/AAA.*BBB.*CCC/!d'
# 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”)
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # 多数sed
gsed '/AAA|BBB|CCC/!d' # 对GNU sed有效
# 显示包含“AAA”的段落 (段落间以空行分隔)
# HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
# 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
# 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA|BBB|CCC/b;d' # 只对GNU sed有效
# 显示包含65个或以上字符的行
sed -n '/^.{65}/p'
# 显示包含65个以下字符的行
sed -n '/^.{65}/!p' # 方法1,与上面的脚本相对应
sed '/^.{65}/d' # 方法2,更简便一点的方法
# 显示部分文本——从包含正则表达式的行开始到最后一行结束
sed -n '/regexp/,$p'
# 显示部分文本——指定行号范围(从第8至第12行,含8和12行)
sed -n '8,12p' # 方法1
sed '8,12!d' # 方法2
# 显示第52行
sed -n '52p' # 方法1
sed '52!d' # 方法2
sed '52q;d' # 方法3,处理大文件时更有效率
# 从第3行开始,每7行显示一次
gsed -n '3~7p' # 只对GNU sed有效
sed -n '3,${p;n;n;n;n;n;n;}' # 其他sed
# 显示两个正则表达式之间的文本(包含)
sed -n '/Iowa/,/Montana/p' # 区分大小写方式
选择性地删除特定行
--------
# 显示通篇文档,除了两个正则表达式之间的内容
sed '/Iowa/,/Montana/d'
#删除文件中相邻的重复行(模拟“uniq”)只保留重复行中的第一行,其他行删除
sed '$!N; /^(.*)
1$/!P; D'
#删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存大小,或者使用GNU sed。
sed -n 'G; s/
/&&/; /^([ -~]*
).*
1/d; s/
//; h; P'
# 删除除重复行外的所有行(模拟“uniq-d”)
sed '$!N; s/^(.*)
1$/1/; t; D'
#删除文件中开头的10行
sed '1,10d'
#删除文件中的最后一行
sed '$d'
#删除文件中的最后两行
sed 'N;$!P;$!D;$d'
#删除文件中的最后10行
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2
# 删除8的倍数行
gsed '0~8d' # 只对GNU sed有效
sed 'n;n;n;n;n;n;n;d;' # 其他sed
# 删除匹配式样的行
sed '/pattern/d' # 删除含pattern的行。当然pattern可以换成任何有效的正则表达式
#删除文件中的所有空行(与“grep '.' ”效果相同)
sed '/^$/d' # 方法1
sed '/./!d' # 方法2
# 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。
# (模拟“cat -s”)
sed '/./,/^$/!d' #方法1,删除文件顶部的空行,允许尾部保留一空行
sed '/^$/N;/
$/D' #方法2,允许顶部保留一空行,尾部不留空行
# 只保留多个相邻空行的前两行。
sed '/^$/N;/
$/N;//D'
#删除文件顶部的所有空行
sed '/./,$!d'
#删除文件尾部的所有空行
sed -e :a -e '/^
*$/{$d;N;ba' -e '}' # 对所有sed有效
sed -e :a -e '/^
*$/N;/
$/ba' # 同上,但只对 gsed 3.02.*有效
# 删除每个段落的最后一行
sed -n '/^$/{p;h;};/./{x;/./p;}'
特殊应用
--------
# 移除手册页(man page)中的nroff标记。在Unix System V或bash shell下使用'echo'命令时可能需要加上 -e 选项。
sed s/.`echo \`//g # 外层的双括号是必须的(Unix环境)
sed 's/.^H//g' # 在bash或tcsh中,按 Ctrl-V 再按 Ctrl-H
sed 's/. //g' # sed 1.5,GNU sed,ssed所使用的十六进制的表示方法
# 提取新闻组或 e-mail 的邮件头
sed '/^$/q' # 删除第一行空行后的所有内容
# 提取新闻组或 e-mail 的正文部分
sed '1,/^$/d' # 删除第一行空行之前的所有内容
# 从邮件头提取“Subject”(标题栏字段),并移除开头的“Subject:”字样
sed '/^Subject: */!d; s///;q'
# 从邮件头获得回复地址
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'
# 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮地址的部分剃除。(见上一脚本)
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'
# 在每一行开头加上一个尖括号和空格(引用信息)
sed 's/^/> /'
# 将每一行开头处的尖括号和空格删除(解除引用)
sed 's/^> //'
# 移除大部分的HTML标签(包括跨行标签)
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
# 将分成多卷的uuencode文件解码。移除文件头信息,只保留uuencode编码部分。文件必须以特定顺序传给sed。下面第一种版本的脚本可以直接在命令行下输入;第二种版本则可以放入一个带执行权限的shell脚本中。(由Rahul Dhesi的一个脚本修改而来。)
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1
sed '/^end/,/^begin/d' $@ | uudecode # vers. 2
# 将文件中的段落以字母顺序排序。段落间以(一行或多行)空行分隔。GNU sed使用字符“v”来表示垂直制表符,这里用它来作为换行符的占位符——当然你也可以用其他未在文件中使用的字符来代替它。
sed '/./{H;d;};x;s/
/==/g' file | sort | sed '1s/==//;s/==/
/g'
gsed '/./{H;d};x;y/
/v/' file | sort | sed '1s/v//;y/v/
/'
# 分别压缩每个.TXT文件,压缩后删除原来的文件并将压缩后的.ZIP文件命名为与原来相同的名字(只是扩展名不同)。(DOS环境:“dir /b”显示不带路径的文件名)。
echo @echo off >zipup.bat
dir /b *.txt | sed s/^(.*).TXT/pkzip -mo 1 1.TXT/ >>zipup.bat
G. sed 脚本替换有重复行怎样处理
sed-i's%<error_path>%<PATH1>%'test.txt
sed-i's%</error_path>%<PATH2>%'test.txt
或者:
sed's/error_path/PATH1/'test.txt#只替换每一行中第1次匹配的error_path
sed‘s/error_path/PATH2/2'test.txt#只替换每一行中第2次匹配的error_path
H. 用sed脚本在input文件里的file:后追加一行 结果出错:./append.sed: line 6: /file:/iWe: 没有那个文件或
We insert a new line. 需要放在双引号里,表示是一个整体。
因为命令解释默认是以空格为命令分隔符的,这样插入的内容只有We,而空格后面的内容会被解释为sed的输入文件,所以报这个错。
--------------------------------------------------------------------------------
明白为什么你不行了,脚本第一行不能有注释。
第一行必须放 #!/bin/sed -f
I. SED是什么
SED
sed 是一个非交互式上下文(context)编辑器,它被设计在下列三种情况下发挥作用:
1) 编辑那些对舒适的交互式编辑而言太大的文件。
2) 在编辑命令太复杂而难于在交互模式下键入的时候编辑任何大小的文件。
3) 要在对输入的一趟扫描中有效的进行多个‘全局’(global)编辑函数。
因为每次只把输入的某些行驻留在内存中,并且不使用临时文件,所以可编辑的文件的有效大小,只受限于输入和输出要同时共存于次级存储的要求。
可以单独的建立复杂的编辑脚本并作为给 sed 的命令文件。对于复杂的编辑,这节省了可观的键入和随之而来的错误。从命令文件运行 sed 高效于作者所知道的任何交互式编辑器,甚至包括能用预先写好的脚本驱动的编辑器。
相较于交互式编辑器而言,根本性的损失是缺乏相对地址(由于操作是每次一行的),和缺乏对命令如期运行的立即验证。
sed 是 UNIX 编辑器 ed 的直系后代。由于在交互式和非交互式操作之间的差异,在 ed 和 sed 之间已经有了可观的变化;甚至 ed 的惯常用户都会经常感到惊讶(并可能气愤),如果他们没有阅读本文档的章节 2 和 3,就草率的使用 sed 的话。在两个编辑器之间最显着的家族性共同之处,在于他们所识别的模式(‘正则表达式’)的种类;匹配模式的代码可以从 ed 的代码几乎原封不动的复制过来,在章节 2 中对正则表达式的描述就是从 UNIX Programmer’s Manual[1] 几乎原封不动的复制过来的。(代码和描述都是 Dennis M. Ritchie 写的)。
J. shell脚本sed命令如何使用变量替换掉包含指定字符串的整行
#先将包含指定字符串的整行打印到变量tmp
tmp=$(sed -n '/${zip}/p' 文本名)
#然后将文本中这一整行字符串替换为你想要修改的字符串
sed -i 's/${tmp}/${zip}/g' 文本名