您的位置:首页 > 运维架构 > Shell

sed和awk中使用shell变量

2011-04-11 15:47 543 查看
转载自 jrckkyy

最终编辑 zengzhaonong

sed和awk中使用shell变量

----------------------------------------------

x=MM

sed 's/AB/'$x'/g' b.c



sed 's/AB/'"$x"'/g' b.c

sed 's/'"$val"'//' urfile

最近做预料处理,使用bash脚本,需要在脚本的sed和awk使用shell变量以控制循环,出现一些问题后找到解决办法如下:

1.sed使用shell变量

 这个比较好办,sed命令中可以用单引号和双引号,一般我们习惯用单引号,如下:

 sed -i 's/pattern1/pattern2/g' inputfile

 如果要使用shell变量,就需要使用双引号

pattern1=XXX

pattern2=XXX

sed -i "s/$pattern1/$pattern2/g" inputfile

2. awk使用shell变量

有很多种方法,最简单的一种记录如下:

line=XXX

awk '$1=="'$line'"{print $0}' inputfile

注意的是,awk命令本身需要将模式和动作部分用单引号引用,所以里面引用shell变量是双引号+单引号,双引号是保证正确处理变量值的空格,放大一下:

"'$line'"

另外:

awk '$1="win"{$"'$curcls'"=$"'$curcls'"+1;print $0}' nwf

则是另一种间接引用模式,因为通常shell的间接引用是使用

eval echo /$$var

更高级的

a=10

b=a

c=${!b}

则c=10

 

 

 

 

 

sed中使用变量,而变量中有特殊字符的情况?

----------------------------------------------

a=helloWWW

b=xxx

echo $a | sed "s/WWW/$b/"

输出:helloxxx 没有问题

但下面:

a='${asdf}/bin/ok'

b='/one/two'

echo $a | sed "s/${.*}/$b/"

bash: s/${.*}/$b/: bad substitution

如果是:

echo $a | sed 's/${.*}/AAA/'

AAA/bin/ok 也没有问题。

请解释一下上面的原因,并给出解决办法?

感觉是因为 $b中包含了路径符号"/" 的原因。如何解决呢?

echo $a | sed "s#${.*}#$b#"

 

sed支持反向匹配

----------------------------------------------

sed -n '/bsp/!p' file

匹配不包含bsp的行

sed的运行结果怎么给变量赋值

----------------------------------------------

var=$(sed ...)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 脚本 bash file c