Chinaunix

标题: 如何用awk或sed实现呢?[ 已解决] [打印本页]

作者: sandermansxj    时间: 2009-11-04 17:12
标题: 如何用awk或sed实现呢?[ 已解决]
哎,基本功不扎实啊,特来请教各位高手们。

比如说:

cat file1-------------file1的内容是变化的
111111


cat file2
.......
省略不重要内容
.......
content := 123456
.....
省略不重要内容
.....
content :=


现在想要把文件2第一处的content := 123456      123456的内容用文件file1的内容111111替换
替换结果为
content := 111111

但是不改变第二处的 content :=  的内容
替换的时候最好用file1的内容,而不是直接写111111


如何用awk和sed实现啊?多谢各位大侠了。

不知道我说清楚了没?

[ 本帖最后由 sandermansxj 于 2009-11-4 17:32 编辑 ]
作者: ly5066113    时间: 2009-11-04 17:17
如果file1只有1行:

sed "0,/content/{/content/s/:= .*/:= $(cat file1)/}" file2
作者: wtuter    时间: 2009-11-04 17:18
标题: 回复 #1 sandermansxj 的帖子
这样行不:



[2]cat 1
111111




[2]cat 2
content := 123456
.....
.......
.....
content :=
[2]
[2]


[2]awk '{getline a < 1;sub(/content := 123456/,"content := "a"");print}' 2
content := 111111
.....
.......
.....
content :=
作者: ywlscpl    时间: 2009-11-04 17:22
awk -v v="`cat file1`" '!T&&/^content/{sub(/:=.*$/,":= "v);T=1}1' file2
作者: sandermansxj    时间: 2009-11-04 17:32
多谢楼上的3位大侠相助,awk和sed 一直不太懂,哎

以后还是要好好学习了
作者: beginner-bj    时间: 2009-11-04 17:34
awk -v v=`cat file1` 'NR==1,/content/{if($1=="content"){$3=v}};1'  file2
作者: ywlscpl    时间: 2009-11-04 17:40
2楼,6楼
学习
作者: beyondfly    时间: 2009-11-05 00:00
学习了
作者: haimming    时间: 2009-11-05 01:17
学习2楼,6楼
尤其是tim的,一直没想过sed这样来处理两文件
作者: sandermansxj    时间: 2009-11-05 09:23
原帖由 beginner-bj 于 2009-11-4 17:34 发表
awk -v v=`cat file1` 'NR==1,/content/{if($1=="content"){$3=v}};1'  file2



假如

content := 123456   2222  3333

我试过后
替换结果为

content := 111111   2222  3333


如果要实现替换结果为

content := 111111

如何再修改呢?
作者: blackold    时间: 2009-11-05 09:24
$0=$1" "v
作者: sandermansxj    时间: 2009-11-05 09:37
原帖由 blackold 于 2009-11-5 09:24 发表
$0=$1" "v



多谢黑哥指导

awk -v v=`cat file1` 'NR==1,/content/{if($1=="content"){$0=$1" := "v}};1'  file2
这样就可以了  

那个 :=  我还是希望能保留的


再次感谢楼上所有的高手们的帮助!
作者: sandermansxj    时间: 2009-11-05 11:04
原帖由 ywlscpl 于 2009-11-4 17:22 发表
awk -v v="`cat file1`" '!T&&/^content/{sub(/:=.*$/,":= "v);T=1}1' file2



黑哥,能再问你一个问题吗?

假如我用一个bash脚本实现这句话

我在脚本的开始先定义变量

NEWSTRING=`cat file1`
PAIREDSTRING="content"


awk -v v="$NEWSTRING"  -v w="$PAIREDSTRING" '!T&&/^w/{sub(/:=.*$/,":= "v);T=1}1' file2---------这样是不行的



怎么样才能把 w的值传到/^ / 这个里面呢?


我这样说,不知道说清楚了没?呵呵

[ 本帖最后由 sandermansxj 于 2009-11-5 11:08 编辑 ]
作者: blackold    时间: 2009-11-05 11:09
sub(w" :=.*$",w" := "v)
sub这样用不是好方法。
作者: ywlscpl    时间: 2009-11-05 11:20
原帖由 sandermansxj 于 2009-11-5 11:04 发表



黑哥,能再问你一个问题吗?

假如我用一个bash脚本实现这句话

我在脚本的开始先定义变量

NEWSTRING=`cat file1`
PAIREDSTRING="content"


awk -v v="$NEWSTRING"  -v w="$PAIREDSTRING" '! ...


awk -v v="$NEWSTRING"  -v w="$PAIREDSTRING" '!T&&"^"w{sub(/:=.*$/,":= "v);T=1}1' file2

  1. [root@Mylinux tmp]# a=123
  2. [root@Mylinux tmp]# echo "123 456" | awk -v v=$a '/456$/&&"^"v'
  3. 123 456
  4. [root@Mylinux tmp]#
复制代码

[ 本帖最后由 ywlscpl 于 2009-11-5 11:22 编辑 ]
作者: sandermansxj    时间: 2009-11-05 11:45
标题: 回复 #15 ywlscpl 的帖子
好像还是不行哦
作者: sandermansxj    时间: 2009-11-05 11:51

  1. cat file1

  2. 111111

  3. cat file2

  4. dfdf
  5. ghghfgjh
  6. content := 123456 gfgfg hghgherer
  7. 565656
  8. 788787
  9. content :=


  10. cat aa-temp.sh

  11. #!/usr/bin/env bash

  12. NEWSTRING=`cat file1`
  13. PAIREDSTRING="content"


  14. awk -v v="$NEWSTRING"  -v w="$PAIREDSTRING" '!T&&"^"w{sub(/:=.*$/,":= "v);T=1}1' file2

  15. ./aa-temp.sh 后file2没有变化

复制代码

作者: ywlscpl    时间: 2009-11-05 12:06
标题: 回复 #17 sandermansxj 的帖子
嗯,搞错了,以为可以省略~,应该这样
  1. awk -v v="$NEWSTRING"  -v w="$PAIREDSTRING" '!T&&$0~"^"w{sub(/:=.*$/,":= "v);T=1}1' file2
复制代码


可以参考
http://bbs.chinaunix.net/viewthr ... p;extra=&page=2
作者: sandermansxj    时间: 2009-11-05 12:31
标题: 回复 #18 ywlscpl 的帖子
多谢多谢了。

awk实在是不太懂了,哎。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2