shell脚本sed
1. shell脚本sed命令如何使用变量替换掉包含指定字符串的整行
#先将包含指定字符串的整行打印到变量tmp
tmp=$(sed -n '/${zip}/p' 文本名)
#然后将文本中这一整行字符串替换为你想要修改的字符串
sed -i 's/${tmp}/${zip}/g' 文本名
2. 使用shell脚本替换与更新文件里的一段内容,可以使用sed, awk等Linux工具
我也给个思路吧 —— 用sed根据地址范围截取文件内容,用Here documents方法添加新的多行内容,然后重组文件。具体步骤如下:
1)截取test.xml文件起始行到<abcdef>行,保存到tmp文件;
2)将要添加的内容根据变量值展开,附加写入tmp文件;
3)截取test.xml文件</abcdef>行到结束行,附加写入tmp文件。
4)移动tmp文件覆盖test.xml文件。
代码:
#!/bin/sh
$hostnames="host1,host2,host3..."
$paragraph="many_strings"
sed-n'1,/^<abcdef>/p'test.xml>tmp
cat<<EOF>>tmp
forhnamein`echo"$hostnames"|tr','''`
do
insert$hname
insert$paragraph
done
EOF
sed-n'/^</abcdef>/,$p'test.xml>>tmp
mvtmptest.xml
注意:
1) for a in b 结构中,b集合里的内容必需要空格分隔。所以我这里做了转换,用tr命令将逗号分隔改为了空格分隔。
2)第二个EOF必需顶格写,前面不能有空格。
3. sed问题。shell脚本下的sed有点奇怪,求解答
#!/bin/bash
STRING="strncpy(orderInfo.szParam,param.getString("szParam").c_str(),sizeof(orderInfo.szParam)-1);szMemo"
cat1.txt|whilereadline
do
param=`echo$line|awk'{print$1}'`
memo=`echo$line|awk'{print$2}'`
echo$STRING|sed"s/szParam/$param/;s/szMemo/$memo/"
echo$dst
done
1.txt 内容:
001002003004
aabbccdd
输出:
strncpy(orderInfo.001,param.getString("szParam").c_str(),sizeof(orderInfo.szParam)-1);002
strncpy(orderInfo.aa,param.getString("szParam").c_str(),sizeof(orderInfo.szParam)-1);bb
这个语句有问题:
echo$STRING|sed"s/szParam/$param/;sed/szMemo/$memo/"
我改成:
echo$STRING|sed"s/szParam/$param/;s/szMemo/$memo/"
或者
echo$STRING|sed"s/szParam/$param/"|sed"s/szMemo/$memo/"
4. shell脚本中的sed s/ /\ /g'这个命令是啥意思
sed的替换命令格式:s/A/B/g 或者 s#A#B#g 或者 s_A_B_g#只是分隔符而已,为满足格式需要。将所有制表符\t替换为|g表示全局替换,有多少次替换多少次。
5. shell脚本 将一个含特殊字符的变量,写入文件对应的位置中,使用sed要么写入的字符不正确要么就报错
假如SSID变量中没有&这个特殊符号,那么直接用sed是可以满足的
SSID='~!@#$%^*[}(/.*\/'
sed-is,ssid=.*,ssid=$SSID,gfilename
但是如果有了&符号,放到sed中会作为特殊用途展开,导致保留了原来的匹配字符,写入的内容会不正确。
此时,只能换一种方式,用awk来操作字符串,然后重新写入到文件中,此时需要多一个临时文件
cpfilenamefilename1;
awk'{gsub("^ssid=.*","ssid='$SSID'");print$0}'filename1>filename;
rm-ffilename1
6. shell的sed用法
sed 是Unix中类似于awk的行编辑器,对于sed工具包的所有操作来说, 我们最关心的其实就是3个最主要的操作. 分别是printing(打印到stdout), deletion(删除), 和substitution(替换). 它与awk不同的地方在于sed是非交互的编辑器,而awk是可交互的编辑器。它即可以从stdin中接收文本输入, 也可以从文件中接收文本输入, 它对输入中的指定行进行特定的操作, 一行操作一次, 然后将结果输出到stdout, 或输出到文件中. 在shell脚本中使用的话, sed通常都是作为管道工具链中的一个处理部分来使用.
Sed的处理方法,上面你提到的表达式叫作“模式匹配”,是一种替换操作:
s/pattern1/pattern2/
意思是用 pattern2 替换pattern1并显示到屏幕上。
讲讲echo "uid=100(guest) gid=100(others) groups=10(users),11(floppy)"|sed 's/^[^(]*(\([^)]*\).*/\1/'的意思 :
echo 是向屏幕显示一行字符
“|”叫管道,象水管一样把“|”前面程序产生的输出作为“|”后的程序的输入。
sed 行编辑器。
's/^[^(]*(\([^)]*\).*/\1/' 对应上文提到的替换参数,分成两部分,pattern1:/^[^(]*(\([^)]*\).*/
表示以不是以“(”开始的字符后面跟任意字符,然后是贪婪匹配模式运算(),任意以“(”字符开始,中间不包括")"字符的任意字符并以“)”后接。后面再接任意字符串。因为前面的程序输出“uid=100(guest) gid=100(others) groups=10(users),11(floppy)”,所以贪婪匹配模式得到结果(guest)
pattern2:/\1/ \1是正则表达式的贪婪匹配模式运算结果。
所以shell语句输出guest替换长长的一串“uid=100(guest) gid=100(others) groups=10(users),11(floppy)”