linux shell sed命令用法

作者&投稿:邴思 (若有异议请与网页底部的电邮联系)
帮忙写个Linux下shell脚本,(使用sed命令处理hosts文件)~

#下面是脚本内容,注意修改/etc/hosts文件需要超级用户权限,换句话说,你需要sudo执行本脚本。



#!/bin/bash
DELIM="'"
N=2

echo "Please pull the file to me."
#read storepath1
storepath1="/etc/hosts"

storepath1=`echo "$storepath1" | cut -d "$DELIM" -f $N`

#这个好理解:
#1.把不是以#号开头的行替换为以!!@开头
#2.把以#号开头的行的 #号删除
#3.把!!@替换为# 号

#sed -i -r -e '/^#/! s|^|!!@|' -e 's|^#||' -e 's|^!!@|#|' "$storepath1"

#这个精炼些
#如果行以 #号开头,则删除#。
# 如果刚刚进行了删除操作,那么执行t 操作,跳到sed脚本末尾,结束操作。
# 如果刚刚没有进行删除操作,那么继续执行s|^|#|,将开头添加 #号。

#sed -i -r -e 's|^#||;t;s|^|#|' "$storepath1"

#这个匹配3位数+点开头的行
#原理同上,只不过不是处理每一行,而是处理以三位数加点号开头的行。

sed -i -r -e 's|^#([0-9]{3}\.)|\1|;t;s|^([0-9]{3}\.)|#\1|' "$storepath1"

sed是一种流编编器,它是文本处理中非常中的工具,能够完美的配合正则表达式便用,功物能不同凡响。
处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”( oattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。
接着理下一行,这样不断重复,直到文件末。文件内容没有改改变,除非使用了写入的命令,将内容更新。
定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
你可以打开Linux命令终端输入sed --help 就可以查询到sed命令的详解。

sed替换命令的结构为: s/A/B/

你在最后少了个斜杠/,结构不完整,会报错。

修改为:

A=hello
ar=$(date "+%Y%m%d")
echo A | sed "s/he/$Var/"


我注意到你结尾忘写斜杠了。

echo $A |  sed "s/he/$Var/"


s/::RE::/::DT::/::OPTION::
是这个语法...

[yao@none ~]$ echo $A | sed "s/he/$Var/"
20130722llo
帮你试过了

linux之sed用法
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是。
举例:(假设我们有一文件名为ab)
删除某行
[root@localhost ruby] # sed '1d' ab #删除第一行
[root@localhost ruby] # sed '$d' ab #删除最后一行
[root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行
[root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行

  显示某行
. [root@localhost ruby] # sed -n '1p' ab #显示第一行
[root@localhost ruby] # sed -n '$p' ab #显示最后一行
[root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行
[root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行

  使用模式进行查询
[root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
[root@localhost ruby] # sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

  增加一行或多行字符串
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end

  代替一行或多行
[root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi
Hi
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi
Hi
end

  替换一行中的某部分
  格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
  [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby

插入
[root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye
-------

sed 命令查找与替换:

(1)删除第2,3行:sed '2,3d' test.txt > new.txt
(2)替换:
替换所有:sed 's/abc/ABC/' test.txt >new.txt
查找: sed -n "/abc/p" test.txt
匹配字符串中的一部分: echo abc123 | sed 's/\([a-z]*\).*/\1/'
echo "ab001_ac" | sed 's/\(.*\)\_\(.*\)/\1,\2/' \1表示第一个括号匹配的字符
echo "ABC01" | sed "s/[A-Z]*\([0-9]*\)/\1/" \1匹配后面的数字部分
echo "ab001_AC88" | sed 's/[A-Z]*\([0-9]*$\)/\1/'
echo "a001_aaST88" | sed "s/\(.*\)\([A-Z][A-Z]\)\([0-9]*$\)/\2/"
sed "s/^/\"&/" <31.txt >32.txt 行首添加双引号
sed "s/$/\"&/" <32.txt >33.txt 行尾添加双引号
sed "s/[ ]*$//" <34.txt >35.txt 替换行尾空格

只显示指定行范围的文件内容,例如:
# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log
sed -n $n"p" 22.txt 显示某一行 n=2
sed大小写转换?

如何先查找,再追加所查找的行到一个新的文件:

(3)查找Tab:
sed "s/[ ]\{2,\}/\|/g" 查找Tab,查找多空格,单独一个空格的除外
awk '/3\t/' 34.txt 查找\t
sed -n '/3[[:space:]]/p' 34.txt 查找空格
sed "/\\t/p" 34.txt 查找tab
echo "\tabc\t23" | sed 's/[[:tab:]]/-/' 替换tab
sed -n '/[[:space:]]*/p' 34.txt 查找tab
如何只替换第2个\t?
(4)
行末空格
sed 's/[ \t]*$//g'

(5)替找空格:
echo "abc 23" | sed 's/[ ]\{2,\}/ /' 把多个空格替换成一个空格
(3)
如果你想在每行的80个字符后加一个冒号,你可写:
sed ‘s/./&:/80’ < file > new
你也可以以蛮力解决,如下:
sed 's/^................................................................................/&:/' <file >new
(4)找一个sed命令在文件每一行加一个变量的例子:
sed 's/.*/&-/' <20.txt >new.txt
用&作为匹配的串
有时你想查找一个模式,然后加上几个字符,比如在匹配的串前后加上括号。如果你是找一个确定的字符串,还是比较简单的,如下即可:
sed ‘s/abc/(abc)/’ < old > new
如果你不是非常清楚你将找到的是串是什么,那你应该如果来利用你找到的串做某种替换呢?
答案就是你需要一个特定的字符”&”,它即指代匹配的模式
sed ‘s/[a-z]*/(&)/’ < old > new
你可以在替换时多次使用”&”,比如,你可以次每行开头的数字复制一次,如下:
% echo “123 abc” | sed ‘s/[0-9]*/& &/’
123 123 abc
让我再修正一下这个例子,sed会以贪婪的方式匹配第一个串。对于’[0-9]*’的第一个区配是第一个字符,因为这个正则是匹配0个或多个数字。所以如果输入是”abc 123”,输出也不会改变(当然,除了有一个空格在字母之前)。一个能保证能匹配一个数字的更好的复制数字的方法是:
% echo “123 abc” | sed ‘s/[0-9][0-9]*/& &/’
123 123 abc
(5)sed 中如何使用变量(变量使用单引号包起来):
echo "abc" | sed 's/ab/'$v'/'

如何在文件的每一行的最前面加一个字符串和空格!
sed 's/^/ttt /g' test

如何在文件的每一行的最前面加一个字符串和空格!
sed 's/^/ttt /g tese | sed 's/$/ sss\&/g'

如何在文件的每一行的最前面加一个字符串和空格!
sed 's/^/ttt /g tese | sed 's/$/ sss\&/g'
(7)匹配空行:
查找空行:sed -n "/^$/p" 20.txt
删除空行:sed "/^$/d" <20.txt >21.txt

n 不打印; sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑),p命令可以用来打印编辑行
c 下一命令是编辑命令,使用多项编辑时加入此选项
f 如果正在调用sed脚本文件,使用此选项,此选项通知sed一个脚本文件支持所用的sed命令,如
sed -f myscript.sed input_file 这里myscript.sed即为支持sed命令的文件

(21) 只显示指定行范围的文件内容,例如:
# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log
(22)退出状态
sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。
(23)y命令
该命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。例如,y/abc/ABC/将把所有小写的a转换成A,小写的b转换成B,小写的c转换成C。

sed '1,20y/hrwang12/HRWANG^$/' datafile
#将1到20行内,所有的小写hrwang转换成大写,将1转换成^,将2转换成$。
#正则表达式元字符对y命令不起作用。与s命令的分隔符一样,斜线可以被替换成其它的字符。
(24)% echo “123 abc” | sed ‘s/[0-9][0-9]*/& &/’
123 123 abc
字符串”abc”没有改变,因为它没有匹配正则表达式,如果你想在输出中删除”abc”,你必须扩展正则表达式来匹配行的其它的部分,并显式地用”(”,”)”和”\1”来指名,这就是下节的内容了。
用\1来指明匹配的部分
我已经在正则表达式那一章中介绍了”(” ”)”和”\1”的用法。现在复习一下,被转义的括号(即,有反斜杠在前面的括号)来记录正则表达的某一部分。”\1”是被记录的第一个模式,”\2”是第二个被记录的模式。Sed可以记录9个模式。
如果你想保存每行的第一个单词,并删除行的其它部分,你可以用下面的命令:
sed ‘s/\(\[a-z]*).*/\1/’
我应该再详细地解释一下。正则表达式是以贪婪的方式匹配。”[a-z]*”匹配0个或多个小写字母,它会尽量匹配更多的小写字母。”.*”会在第一个匹配后匹配0个或多个字符。因为第一个模式已经匹配了所有的小写字母,第二个模式会匹配剩下的字符,所以你使用命令:
echo abcd123 | sed ‘s/\([a-z]*\).*/\1/’
会输出”abcd”,而删除后面的数字。
如果你想调换两个单词的位置,你可记录两个模式,并改变它们的次序。
sed ‘s/\([a-z]*\) \([a-z]*\)/\2 \1/’
注意两个模式中间是有空格的。这个可保证找到两个单词。但是[a-z]*这种模式会匹配0个字母,如果你想至少匹配一个字母,你可以用下面的命令:
sed ‘s/\([a-z][a-z]*\) \([a-z][a-z]*\)/\2 \1/’
“\1”并不需要一定出现在替换串中(右部),它你也可以在查找的模式中(左部)。如果你想删除重复的单词,你可以用:
sed ‘s/\([a-z]*\) \1/\1/’
注意你最多使用9个值,从”\1”到”\9”


慈溪市17139953869: linux命令 sed 请问有哪位大大知道这个sed 命令是什么意思吗? sed 's/\//\\\//g' -
智哗爽前: 截取或修改字符串,打印到屏幕上. 使用方法:sed 参数 '动作' 动作对象 如果用-i参数将修改文档的内容,你的sed 's/\//\\\//g'这个我举一个类似的再分析你的. sed 's/old/new/g' *** 这个就是把***文档里面的old这个词换成new这个词. 你的sed ...

慈溪市17139953869: sed 使用方法 -
智哗爽前: 在shell中输入下面的命令,输出是什么 echo s/\^/,/g 输出是 s/^/,/g ,在shell中反斜杠本身就有转义的作用,因此不加双引号实际执行的命令是 sed "/^/,/g" file > file1 即在文本开头添加一个逗号 加上双引号\^在传给sed之前才不会被转义成^

慈溪市17139953869: linux 的sed命令解释 sed ':t;N;s/\n/,/;b t' 将换行符换成逗号 -
智哗爽前: :t 定义label "t"b t 转到label "t" 继续执行N 先读入一行到sed的模板空间,加个换行符(\n),再向...

慈溪市17139953869: linux shell编程sed用法 -
智哗爽前: sed比较难 awk则很好解决

慈溪市17139953869: Linux中sed命令查找替换某行中的字符 -
智哗爽前: sed '/minlength/s/[0-9]\+/30/'

慈溪市17139953869: 求在linux下SED命令的正则使用方法
智哗爽前: 如果文本内容是如下形式 id:0 id:2 id:3 id:7 可以用cat a.txt | sed -e 's/id://g'

慈溪市17139953869: linux命令怎么显示文件某一行或几行内容 -
智哗爽前: 使用sed命令; 具体查看使用规则: #sed --help; 显示文件X行命令: #sed -n 'xp' filename 显示文件X行到Y行的内容: #sed -n 'x,yp' filename相关显示命令还有tail,cat.awk,head等,可以常看LInux命令大全,或者man命令|help命令查看相关用法.

慈溪市17139953869: linux指令 sed指令怎么选择列 -
智哗爽前: 首先我这边先建一个字母大小转换的脚本test2.sh,内容如下:先介绍些sed -n的应用:sed命令中p能实现打印匹配行的功能.我们可以实际看下sed命令带-n和不带-n情况下有什么不同.sed -n "1p" test2.sh:带-n选项的话,只打印test2.sh脚...

慈溪市17139953869: Linux shell正则表达式的问题关于sed命令中使用正则表达式,我有以下一些疑问.这里有两个例子.$ echo this is an example | sed 's/\w\+/[&]/g'[this] [is] [an] [... -
智哗爽前:[答案] \w+的意思是数字和字母的字串 而你后一个用的是[a-z]+小写字母的字串 其实上面那个\w ,你也可以写成[a-zA-Z0-9_]+ 效果是一样的

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网