Linux shell中关于两个文件的部分内容替换的问题,详情如下:

A文件:格式内容为:
。。。。
*DDD= 111 2222 3333 4444
*222 289 6768 7878 7878
*。。。。。
*。。。。。
。。。。。其中DDD是关键字,*表示续行;
B文件是:
TIME1 T2 T3 T4
xxx xxxx xxx xxx
xxx xxx xxx xxx
。。 。。 。。 。。
要实现的目标就是将B文件的T2列下面的数据替换掉A文件中关键字'DDD'后面的以及续行上的数据,即最后结果为:
。。。。(不变)
*DDD= xxxx xxx xx xxxx xxxx(每行8个数据)
* xxxx xxxxx xxx xxxx xxxxx(8个数据)
* xxxx 。。。。。。。。。
* xx 。。。。。。。。。
。。。。。。。(不变的部分)
求大神解答

这个都是小意思, 就是shell编程的问题。
如果楼主方便的话, 可以帮忙看一下的。
对了, 以后的Linux系统管理问题, shell编程问题,python的开发需求或者是apache, nginx ,php都行啊!追问

我最近才开始学shell编程,也看了sed命令和awk命令,可是对于这个问题还是没有头绪,能不能请教一下应该用什么命令来实现呢?

追答

这个要结合awk和se的 , 不过重要的是编程的思路啊,也就是为什么经验在企业中是很值钱的道理了。
如果楼主可以的话, 可以看下网名吗?

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-11-20
#!/bin/sh
start=`sed -n '/DDD=/=' A` #得到替换的起始行
pos=$start #pos为行计数器
awk 'NR>1{a=a" "$2;if(NR%8==1){print a;a=""}}' B | while read line
do
    sed -i $pos'c\'"$line" A #替换行内容
    let pos+=1 #递增替换行
done
sed -i $start's/.*/DDD=&/' A #在数据起始行的行首加上"DDD="

既然是替换,那么数据行数肯定是相等的吧?

追问

首先谢谢大侠的帮助了。然后就是数据行数和个数都不一定相等。假设A文件关键字DDD后面有30行数据(以*号续行的,31行以后为其他不需要替换的数据)。然后B文件T2列有400个数据,现在就用这400个数据去替换A的30行数据,每行8个400个就是50行了。或者B文件只有200个数据,那每行8个就是25行,现在就要用这25行去替换A文件的那30行数据了。不知道我说清楚没。

追答

如果行数不等,就不能像上面那样直接按行替换了。需要先删除A文件中的原数据,然后再插入新数据。

而要删除原数据,就需要知道原数据的起始行和结束行。起始行可以通过匹配“DDD=”,结束行最好也有个关键字;如果没有,我这里只能先按照你提供的30行长度和起始行位置来计算。

#!/bin/sh
start=`sed -n '/DDD=/=' A` #得到替换的起始行
let end=start+30-1 #计算得到结束行
sed -i $start','$end'd' A #删除原数据

pos=$start #pos为行计数器
awk 'NR>1{a=a" "$2;if(NR%8==1){print a;a=""}}' B | while read line
do
    sed -i $pos'i\'"$line" A #插入新数据行
    let pos+=1 #递增插入行位置
done
sed -i $start's/.*/DDD=&/' A #在数据起始行的行首加上"DDD="

Linux下的shell编程 如何替换文件中的内容
方法1:sed -i 's\/被替换的内容\/要替换成的内容\/' file 方法2:sed 's\/被替换的内容\/要替换成的内容\/g' file > file.out;mv file.out file。

shell脚本替换A、B两个文件里面的内容
可以使用sed进行操作,先定义一个参数读取A文件中的第一行 LineA=`sed...` 或者是使用cat把内容读取出来,再使用sed的替换方法,将B文件中的第一行替换为$LineA即可。希望有帮助

如何在shell脚本中修改添加替换指定文件中的内容
1、启动Linux系统,用ssh工具连上Linux系统。2、bash自带了一些调试选项。3、在脚本启动时添加调试选项。来调试debug.sh。4、在脚本内添加调试选项,使用set 命令。5、现在要看debug.sh脚本执行的调试信息,就不需要使用bash -x .\/debug.sh执行了。6、在脚本开头添加-xv选项。7、同样现在执行.\/debu...

shell sed 或tr替换的时候有部分内容替换不完全:
1、去除重复的字符 删除空白行就是删除换行符\/n。注意:这些空白行上只有回车符,没有空格符。cat test.txt I love linux!Hello World!Shell is worthy to been studied.这里用换行符的转义字符\\n.注意:此处用-s删除了多余的换行符,如果用-d,则会删除所有的换行符.cat test.txt | tr -s [...

linux shell编程中文件内容修改方法
!\/usr\/bin\/ksh 这里的两个变量一个是学号,一个是数据文件 serial="S1002"dbfile="cj.db"显示行号和该行的信息 showMessage(){ sed -n "\/${serial}\/{=;p;}" ${dbfile} } 设置数学成绩 setMath(){ sed "\/${serial}\/s\/:[^:]\\{1,\\}\/:$1\/3" ${dbfile} } 设置语文成绩 set...

shell中文件字符串替换
答案:在Shell中,可以使用`sed`命令进行文件字符串替换。具体语法为:`sed -i 's\/原字符串\/新字符串\/g' 文件名`。详细解释:1. sed命令简介 `sed`是一个流编辑器,用于对文本文件进行非交互式处理。它可以对文件内容进行搜索、替换、删除、插入等操作。2. 字符串替换语法 `sed`命令中的替换...

在LINUX中如何把2个文件中的内容合到另一个文件中去?
1、首先,连接相应linux主机,进入到linux命令行状态下,等待输入shell指令。2、其次,在命令行中输入:cat test.txt test1.txt > test2.txt。3、键盘按“回车键”运行shell指令,此时会看到2个文件成功合并到test2.txt了。

如何通过linux shell 将两个文件中的内容,进行多条件匹配,并且做并集合 ...
1 AAA FN123 1000 10.0362 2 BBB FN456 2000 15.8355 cat 2 1 AAA FN123 2000 20.0362 2 BBB FN456 3000 45.8355 3 CCC FN1a3 2000 20.0362 cat 1 2 |sort -n -k4 -r|awk '!a[$2]++'|awk 'BEGIN{i=1}{if(...

请问怎么在shell脚本中,替换文件多行里面的指定字符串
sed -i '\/aaa\/{:a;n;s\/123\/xyz\/g;\/eee\/!ba}' yourfile先匹配aaa,匹配到后执行大括号里的语句。n 读取下一行 s\/123\/xyz\/g 将123替换为xyz,全局替换,同一行中出现几次替换几次 :a 设定跳转标签a \/eee\/!ba 若当前行匹配不上eee,则跳转到标签a处继续执行,构成一个循环。若匹配...

linux 文件内容替换问题
文件内容替换涉及到的命令如下:1、打开文件后,进入一般模式(即没法修改文件的模式)2、输入 :1,$s\/word1\/word2\/g 指从第一行到最后一行,将word1换为word2 3、可以在g后面加上字母c,这样替换前都需要用户确认。

相似回答