免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助用sed或awk进行文件替换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-16 16:47 |只看该作者 |倒序浏览
5可用积分
输入:
参数1: Insufficient free space in the %s  directory. The free space is only %s. At least %s is required.
参数2: /export/home
参数3: 5%
参数4: 20%

输出: Insufficient free space in the /export/home directory. The free space is only 5%. At least 20% is required.

简单描述:
给出一个源串,如:Insufficient free space in the %s  directory. The free space is only %s. At least %s is required.
把其中%s替换为指定的字符串,如:/export/home,  5%, %20
可以保证%s出现的个数与指定要替换的字符串个数相同, 但指定要替换的字符串个数是不定的,同时要替换的字符串内容也不定。

本想用awk接收外部参数(指定要替换的字符串), 然后以%s作为分隔符,在每个域后面加上指定的字符串,但不知道如何将不定参数传入到awk中。

也考虑过用sed循环替换其中的%s, 但是由于 指定的参数内容不确定,可能就包括了sed指定的分隔符。

有没有较好的替换方式,求大神指点。

最佳答案

查看完整内容

回复 1# legone2008

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-04-16 16:47 |只看该作者
本帖最后由 Herowinter 于 2014-04-16 17:54 编辑

回复 1# legone2008
  1. #!/bin/bash

  2. s=$1
  3. for((i=2;i<=$#;i++));do
  4.     s=$(awk -vt=${!i} '{sub("%s",t);print}'<<<$s)
  5. done
  6. echo -e "\n****After repalcement****\n"
  7. echo $s
复制代码
  1. ./print.sh "Insufficient free space in the %s  directory. The free space is only %s. At least %s is required." "/export/#home" "5%" "20%"

  2. ****After repalcement****

  3. Insufficient free space in the /export/#home directory. The free space is only 5%. At least 20% is required.
复制代码

论坛徽章:
6
摩羯座
日期:2013-12-27 09:45:04技术图书徽章
日期:2014-01-27 12:40:06辰龙
日期:2014-02-28 15:12:52巳蛇
日期:2014-03-21 17:06:27未羊
日期:2014-04-15 20:12:41黑曼巴
日期:2016-08-02 11:00:06
3 [报告]
发表于 2014-04-16 16:50 |只看该作者
回复 1# legone2008


    printf "Insufficient free space in the %s  directory. The free space is only %s. At least %s is required." /export/home 5% 20%

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
4 [报告]
发表于 2014-04-16 17:04 |只看该作者
  1. => awk -va='/export/home' -vb='5%' -vc='20%' 'BEGIN{print  "Insufficient free space in the "a" directory. The free space is only "b". At least "c" is required."}'
  2. Insufficient free space in the /export/home directory. The free space is only 5%. At least 20% is required.
复制代码
可以吗?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
5 [报告]
发表于 2014-04-16 17:13 |只看该作者
回复 1# legone2008

try:
  1. $ cat test.sh
  2. #! /bin/bash

  3. n=1
  4. for i in "$@"
  5. do
  6.         if [ $n -eq 1 ]
  7.         then
  8.                 str=$i
  9.         else
  10.                 str=$(echo $str | sed "s#%s#$i#")
  11.         fi

  12.         let n=n+1
  13. done
  14. echo $str
  15. $
  16. $ test.sh 'Insufficient free space in the %s  directory. The free space is only %s. At least %s is required.' /export/home 5% 20%
  17. Insufficient free space in the /export/home directory. The free space is only 5%. At least 20% is required.
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-04-16 17:27 |只看该作者
楼上几位都没有认真看要求。
@2楼,3楼: 参数个数不定,参数值不定  
@4楼: 如果参数中包含#,sed就会出错, 如:/export/#home

论坛徽章:
6
摩羯座
日期:2013-12-27 09:45:04技术图书徽章
日期:2014-01-27 12:40:06辰龙
日期:2014-02-28 15:12:52巳蛇
日期:2014-03-21 17:06:27未羊
日期:2014-04-15 20:12:41黑曼巴
日期:2016-08-02 11:00:06
7 [报告]
发表于 2014-04-16 17:30 |只看该作者
回复 5# legone2008


    参数个数定不定有关系吗?参数数量与%s数量一致就足够了,有多少写多少

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
8 [报告]
发表于 2014-04-17 08:31 |只看该作者
回复 5# legone2008


用2楼的方法吧,最简单:
  1. $ cat test.sh
  2. #! /bin/bash

  3. str=printf
  4. for i in "$@"
  5. do
  6.         str="$str '$i'"
  7. done
  8. eval $str
  9. $
  10. $ test.sh 'Insufficient free space in the %s  directory. The free space is only %s. At least %s is required.' /export/home 5% 20%
  11. Insufficient free space in the /export/home directory. The free space is only 5%. At least 20% is required.
复制代码

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
9 [报告]
发表于 2014-04-17 09:50 |只看该作者
回复 8# ly5066113
学习了,sed或awk确实绕弯了,
应该直接printf的。


   

论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
10 [报告]
发表于 2014-04-17 11:06 |只看该作者
  1. #!/bin/sh
  2. [ "$1" == "" ] && echo "$1 is Null" && exit

  3. [ `echo $(($#-1))` != `echo $1 | egrep -o "%s" | wc -l` ] && echo "\%s the wrong number!" && exit

  4. eval echo $(echo $1 | awk '{for(i=1;i<='`echo $[$#-1]`';i++){sub(/%s/,"$"i+1)}}1')
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP