免费注册 查看新帖 |

Chinaunix

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

sed能否进行非正则的替换? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-05 11:37 |只看该作者 |倒序浏览
现在一个目录下的所有文件进行字符串替换,但是这些字符串包含了一些特殊的字符如$ .
用sed替换的时候就需要对这些字符进行转义,比较麻烦

那sed在替换的时候能不能只进行简单的字符串匹配替换,而不进行正则替换

论坛徽章:
0
2 [报告]
发表于 2009-03-05 11:42 |只看该作者
不行吧

论坛徽章:
0
3 [报告]
发表于 2009-03-05 11:45 |只看该作者
好像是要转义的,没办法

论坛徽章:
9
2015亚冠之阿尔纳斯尔
日期:2015-09-10 16:21:162015亚冠之塔什干火车头
日期:2015-07-01 16:23:022015年亚洲杯之巴勒斯坦
日期:2015-04-20 17:19:46子鼠
日期:2014-11-13 09:51:26未羊
日期:2014-08-28 18:13:36技术图书徽章
日期:2014-02-21 09:30:15酉鸡
日期:2014-01-14 11:12:49天蝎座
日期:2013-12-09 17:56:53平安夜徽章
日期:2015-12-26 00:06:30
4 [报告]
发表于 2009-03-05 11:45 |只看该作者
s/regexp/replacement/
              Attempt to match regexp against the pattern space.  If  success-
              ful,   replace  that  portion  matched  with  replacement.   The
              replacement may contain the special character & to refer to that
              portion  of  the  pattern  space  which matched, and the special
              escapes \1 through \9 to refer  to  the  corresponding  matching
              sub-expressions in the regexp.

论坛徽章:
0
5 [报告]
发表于 2009-03-05 11:56 |只看该作者
目前好像办不到!

论坛徽章:
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
6 [报告]
发表于 2009-03-05 12:10 |只看该作者

回复 #1 prc 的帖子

给个例子,也许有变通的方法。

论坛徽章:
0
7 [报告]
发表于 2009-03-05 12:13 |只看该作者
是啊,很多高手在这里,也许能想到更好的方案呢!

论坛徽章:
0
8 [报告]
发表于 2009-03-05 12:15 |只看该作者
需要转义吧!

如果没有它 目前来说还是行不通的!

论坛徽章:
0
9 [报告]
发表于 2009-03-05 12:36 |只看该作者
原帖由 ly5066113 于 2009-3-5 12:10 发表
给个例子,也许有变通的方法。

实际的应用是这样的:
1. 在当前目录及其子目录下搜索所有以$开头的文件
2. 在当前目录及其子目录下的所有文件中查找(1)中出现的文件名,如果找到,将$替换为_
3. 将(1)中所有的文件重命名,$替换为_

论坛徽章:
0
10 [报告]
发表于 2009-03-05 12:41 |只看该作者
既然必需用正则替换,写了个函数自动对字符串进行转义的...


  1. #!/bin/bash

  2. #
  3. #  Rename scripts for the clinets whose version control system rejects `$' symbol...
  4. #

  5. function to_sed_pattern()
  6. {
  7.         local len c i
  8.         len=${#1}
  9.         for((i=0;i<len;i++)) {
  10.                 c=${1:i:1}
  11.                 case $c in
  12.                 '.'|'*'|'$'|'^'):
  13.                         echo -n "\\$c";;
  14.                 *):
  15.                         echo -n "$c"
  16.                 esac
  17.         }
  18.         echo
  19. }

  20. old_files=$(find ! -name '*.svn*' -a -name '$*' -print | sed 's:^[.]/::g' )
  21. while read file
  22. do
  23.         new=$(sed 's/\$/_/g' <<<"$file")
  24.         regex=$(to_sed_pattern "$file")
  25.         sed_script="${sed_script}s:$regex:$new:g"$'\n'
  26.         move_cmds="${move_cmds}mv -f '$file' '$new'"$'\n'
  27. done <<<"$old_files"
  28. echo "$sed_script"
  29. echo "$move_cmds"
  30. for file in $(find ! -name '*.svn*' -a \( -name '*.sh' -a ! -name "$0" \))
  31. do
  32.         files="$files'${file}' "
  33. done
  34. eval sed -i -f <(echo "$sed_script") $files
  35. eval -- "$move_cmds"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP