sed、awk调用shell变量的方法
这两天小弟用sed查找替换的功能,想查找替换完字符后把源文件覆盖掉,网上查了查资料,也没有现成结果(拿来主义,懒人一族),不得已自己得写了,其实很简单,脚本如下: bash-2.05# sed -e 's/windows/linux/g' free.htm >temp ; rm free.htm ; mv temp free.htm 一行写下来,free.htm是源文件,只是用了一个临时文件temp 供大家查考吧,是不是太简单了 |
以上来自网络,但是实在是没什么用。
1.使用sed命令替换字符串中的指定字符,并显示替换的行:
sed 可以使用shell变量,只需将单引号变为双引号即可。
76 #Change every script's name 77 78 for i in $list ;do 79 len=${#i} 80 realfile=${i:`expr $len - 21`:21} 81 if [[ $realfile != "upgrade_partitions.sh" ]] ;then 82 if [[ $flag == "add" ]] ;then 83 newname=$(echo "$i" | sed -n "s/_${version}.sh/_`expr ${version} + 1`.sh/p") 84 else 85 newname=$(echo "$i" | sed -n "s/_${version}.sh/_`expr ${version} - 1`.sh/p") 86 fi 87 echo "newname:$newname" 88 mv $i $newname 89 fi 90 done
2.只用 '-i' 选项,sed可以使替换后的文件写回到源文件,实现文件的覆盖。
57 #Change the content of every script 58 for i in $list ;do 59 len=${#i} 60 realfile=${i:`expr $len - 21`:21} 61 if [[ $realfile != "upgrade_partitions.sh" ]] ;then 62 echo "The $i file need change!" 63 if [[ $flag == "add" ]];then 64 # scr_str=$(printf "%s%s%s" "_" $version ".sh") 65 # echo "$i : version:$scr_str" 66 sed -i "s/_${version}.sh/_`expr $version + 1`.sh/g" $i 67 else 68 sed -i "s/_${version}.sh/_`expr $version - 1`.sh/g" $i 69 fi 70 else 71 echo "The upgrade_partitions.sh no need change!" 72 fi 73 74 done
我们在编写shell脚本的时候,经常会遇到在脚本中使用awk或sed去调用shell环境中的变量的时候,下面我简单的说一下调用的方法。
sed一般使用单引号,sed引用shell变量时使用双引号即可,因为双引号是弱转义,不会去除$的变量表示功能,而单引号为强转义,会把$作为一般符号表示,所以不会表示为变量。
1 sed -e "s#user_defined_basedir#$mysql_base_dir#g" -e "s#user_defined_datadir#$mysql_data_dir#g" mysqld.sh -i
awk在调用shell变量时,需要使用参数-v,举例说明:
1 awk -v a=$second -v b=$count '$2==a{sum += $1};END {print sum/b}' filename
其中$second、和$count为shell中变量,可以看出,每调用一次变量都要加一个-v参数,后面使用shell变量的时候,就不用加$了,直接是a和b就好了
------------------------------------------------------------------------------------------------------------------------
来自:http://blog.chinaunix.net/uid-7396950-id-2056484.html
最近做预料处理,使用bash脚本,需要在脚本的sed和awk使用shell变量以控制循环,出现一些问题后找到解决办法如下:
1.sed使用shell变量
这个比较好办,sed命令中可以用单引号和双引号,一般我们习惯用单引号,如下:
1 sed -i 's/pattern1/pattern2/g' inputfile 2 #如果要使用shell变量,就需要使用双引号 3 pattern1=XXX 4 pattern2=XXX 5 sed -i "s/$pattern1/$pattern2/g" inputfile
2. awk使用shell变量
1 有很多种方法,最简单的一种记录如下: 2 line=XXX 3 awk '$1== " '$line' " {print $0}' inputfile 4 注意的是,awk命令本身需要将模式和动作部分用单引号引用,所以里面引用shell变量是双引号+单引号,双引号是保证正确处理变量值的空格,放大一下: 5 " '$line' " 6 另外: 7 awk '$1="win"{$"'$curcls'"=$"'$curcls'"+1;print $0}' nwf 8 则是另一种间接引用模式,因为通常shell的间接引用是使用 9 eval echo \$$var 10 更高级的 11 a=10 12 b=a 13 c=${!b} 14 则c=10