免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3483 | 回复: 6
打印 上一主题 下一主题

[文本处理] 请教一个问题关于文件内容替换的,不能直接在原文件上直接修改,替换结果存储到临... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2019-04-11 11:42 |只看该作者 |倒序浏览


请教一个问题关于文件内容替换的,不能直接替换。

有两个文件:A,B

用文件A中的

@passport.channel@=0907

替换文件B中

passport.channel = @passport.channel@

但是不能直接替换,替换结果存储到临时文件中。临时文件夹目录:tmp

不能直接替换是否是指不能用sed吗?

多谢指点




论坛徽章:
0
2 [报告]
发表于 2019-04-11 16:32 |只看该作者
本帖最后由 cgiyan 于 2019-04-11 21:43 编辑

#!/bin/sh
file1=1.txt
file2=2.txt

pass_new1=`cat $file1| awk -F '@=' '/passport.address/{print $2}'`
pass_new2=`cat $file1| awk -F '@=' '/passport.apiUserId/{print $2}'`
pass_new3=`cat $file1| awk -F '@=' '/passport.channel/{print $2}'`
pass_new4=`cat $file1| awk -F '@=' '/passport.apiUserSecrt/{print $2}'`

pass_old1=`cat $file2| awk -F '= ' '/@passport.address@/{print $2}'`
pass_old2=`cat $file2| awk -F '= ' '/@passport.apiUserId@/{print $2}'`
pass_old3=`cat $file2| awk -F '= ' '/@passport.channel@/{print $2}'`
pass_old4=`cat $file2| awk -F '= ' '/@passport.apiUserSecrt@/{print $2}'`

sed -i '/@passport.address@/{s/$pass_old1/$pass_new1/}'  $file2
sed -i "/@passport.apiUserId@/{s/$pass_old2/$pass_new2/}" $file2
sed -i "/@passport.channel@/{s/$pass_old3/$pass_new3/}" $file2
sed -i "/@passport.apiUserSecrt@/{s/$pass_old4/$pass_new4/}" $file2


能否简化pass_new1,2,3,4 ;pass_old1,2,3,4
后续可以扩展


论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
3 [报告]
发表于 2019-04-11 17:46 |只看该作者
本帖最后由 1cpuer 于 2019-04-11 17:55 编辑

#.: echo 'passport.channel = @passport.channel@' | sed -r "s/(passport.channel = )(@passport.channel@)/\\2=0907/g"
@passport.channel@=0907

#.: test_A='@passport.channel@=0907';echo $test_A
@passport.channel@=0907
#.: echo 'passport.channel = @passport.channel@' | sed -r "s/passport.channel = @passport.channel@/"$test_A"/g"
@passport.channel@=0907

论坛徽章:
0
4 [报告]
发表于 2019-04-11 21:42 |只看该作者
回复 3# 1cpuer

谢谢,但是没太看懂

论坛徽章:
0
5 [报告]
发表于 2019-04-11 21:45 |只看该作者
如何能把替换结果存储到临时文件中呢?

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
6 [报告]
发表于 2019-04-12 08:00 |只看该作者
本帖最后由 1cpuer 于 2019-04-12 08:25 编辑

sed -ri "s/(passport.channel = )(@passport.channel@)/\\2=0907/g" B_file
test_A='@passport.channel@=0907';sed -ri "s/passport.channel = @passport.channel@/"$test_A"/g" B_file

哪个不懂不防指明

sed -i '/@passport.address@/{s/$pass_old1/$pass_new1/}'  $file2
引用 【cgiyan】 的一行,其实和他的解题思路是一样的;只是书写方式变化了一下。
cgiyan:变量多了一点,或许是Shell的一种方式。

匹配[url=]字符串[/url]@passport.address@花括号:s/匹配变量:pass_old1/替换变量:pass_new1/
sed 'command{command}'
sed '单引号嵌套命令;再则:花括号嵌套命令'
而我的没有花括号,之所以替换区的变量用双引号嵌套。

评分

参与人数 1信誉积分 +15 收起 理由
cgiyan + 15

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2019-04-15 13:24 |只看该作者
sed -n '/@passport.channel@/{s/.*=//;p;q}' A |xargs -i sed 's/@passport.channel@/{}/' B   >/tmp/tmp_file

评分

参与人数 1信誉积分 +20 收起 理由
cgiyan + 20

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP