SED/AWK字符串替换

Joyce_ZhuRouRou 2014-08-04 07:14:12
有一个xml文件,里面内容如下:
<project name="aaa" version="****" package="****">
<project name="bbb" version="****" package="****">
<project name="ccc" version="****" package="****">
<project name="ddd" version="****" package="****">
......
需要修改某些project的version,已知需要修改的project的name以及新的version号,请问需要怎么用sed或awk来进行替换呢?

这里的问题是,首先要找到需要修改的Project 的那一行,再在该行上面进行修改。

找出行我用的是:
  cat ./test.xml | while read LINE
do
echo $LINE | grep -q $1 && ******
done

但是 && 后面的替换就一直弄不出来,请大侠赐教,谢谢
...全文
196 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joyce_ZhuRouRou 2014-08-14
  • 打赏
  • 举报
回复
引用 7 楼 ljc007 的回复:
modify_manifest()
{
sed -r "/\"$1\"/s/vision=\".*\" (.*)/vision=\"$3\" \1/" a.xml > b.xml
}
谢谢大侠。是我一开始对这些实在懂的太少了,后来研究了一下,自己也找到了方法,实在太感谢你了,看来什么东西都需要自己静下心来研究,其实就没有那么难,呵呵
ljc007 2014-08-06
  • 打赏
  • 举报
回复
modify_manifest()
{
sed -r "/\"$1\"/s/vision=\".*\" (.*)/vision=\"$3\" \1/" a.xml > b.xml
}
Joyce_ZhuRouRou 2014-08-05
  • 打赏
  • 举报
回复
引用 5 楼 ljc007 的回复:
[quote=引用 4 楼 Joyce_Qin_1986 的回复:] 我研究了一下这个语句,这样理解对吗: 对于a.xml 文件里面的每一行,如果 匹配 project name="aaa"成功(就是含有这个字符串),则将该行<project name=".*" version=".*" (.*) 替换为<project name="aaa_new" version="v_new" ,后面的\1是指只替换匹配到的第一个,对吗? 然后将修改后的文件重定向保存为b.xml 不知道我这样理解对不对?希望大侠再指点一下,平时主要做Android的应用开发,对这个不太了解。谢谢
后面的\1是指前面的(.*) 参考:http://bbs.chinaunix.net/thread-605570-1-1.html[/quote] 大侠,我看了你推荐的网址,然后按照自己的理解跟需求写了这样的语句: modify_manifest() { sed -r '/"$1"/s/vision=".*"(.*)/vision="$3"\1/'a.xml>b.xml } 其中"$1"和"$3"是函数传进去的参数,分别表示需要修改的Project name和新的version号,但是会报错,说 sed: -e expression #1, char 43: unknown option to `s', 是sed不能引用参数吗?还是需要怎么样去引用呢? 然后我又将这个两个参数都改成了字符串,但是还是报这个错误。
ljc007 2014-08-05
  • 打赏
  • 举报
回复
引用 4 楼 Joyce_Qin_1986 的回复:
我研究了一下这个语句,这样理解对吗: 对于a.xml 文件里面的每一行,如果 匹配 project name="aaa"成功(就是含有这个字符串),则将该行<project name=".*" version=".*" (.*) 替换为<project name="aaa_new" version="v_new" ,后面的\1是指只替换匹配到的第一个,对吗? 然后将修改后的文件重定向保存为b.xml 不知道我这样理解对不对?希望大侠再指点一下,平时主要做Android的应用开发,对这个不太了解。谢谢
后面的\1是指前面的(.*) 参考:http://bbs.chinaunix.net/thread-605570-1-1.html
Joyce_ZhuRouRou 2014-08-04
  • 打赏
  • 举报
回复
引用 2 楼 ljc007 的回复:
sed -r '/project name="aaa"/s/<project name=".*" version=".*" (.*)/<project name="aaa_new" version="v_new" \1/' a.xml > b.xml
我研究了一下这个语句,这样理解对吗: 对于a.xml 文件里面的每一行,如果 匹配 project name="aaa"成功(就是含有这个字符串),则将该行<project name=".*" version=".*" (.*) 替换为<project name="aaa_new" version="v_new" ,后面的\1是指只替换匹配到的第一个,对吗? 然后将修改后的文件重定向保存为b.xml 不知道我这样理解对不对?希望大侠再指点一下,平时主要做Android的应用开发,对这个不太了解。谢谢
Joyce_ZhuRouRou 2014-08-04
  • 打赏
  • 举报
回复
引用 2 楼 ljc007 的回复:
sed -r '/project name="aaa"/s/<project name=".*" version=".*" (.*)/<project name="aaa_new" version="v_new" \1/' a.xml > b.xml
大侠,说实在的,看不太懂你这句语句,呵呵。我这里面,name那一个域是不会变的,所以您的答案里面红色的部分 name那一块应该是不需要吧? 对于需要修改的project,我有一个update.xml文件做如下记录: projectnameaaa new_versionaaa projectnamebbb new_versionbbb ...... 我会逐行读取这个xml文件,然后根据每一行里面的projectname ,找到这个project在上面那个XML文件,(project.xml)里面的对应行,然后修改那一行的version域的值。 我现在的做法如下: for(line in update.xml) 获取需要update的project_name依据new_version do for(line in project.xml) do if(line contains project_name) { 修改该行的version域为new_version } done done 在project.xml 里面的每一行,name为第一个域,但version不一定是第二个域,有可能还会插入其他的类似date之类的域,但是需要修改的就只有version这个域,而且,格式就是 version=“****” 这样的 麻烦大侠再指点一下,谢谢。
ljc007 2014-08-04
  • 打赏
  • 举报
回复
sed -r '/project name="aaa"/s/<project name=".*" version=".*" (.*)/<project name="aaa_new" version="v_new" \1/' a.xml > b.xml
ljc007 2014-08-04
  • 打赏
  • 举报
回复
sed -r '/project name="aaa"/s/<project name=".*" version=".*" (.*)/<project name="aaa_new" version="v_new" \1/' a.txt

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧