字符串替换的sed命令问题

时间:2017-04-27 15:34:41

标签: string bash macos shell sed

我的sed命令出现奇怪的问题。

我有一个脚本,它接受一个c文件,复制X次,然后通过在名称中添加数字来替换其中的函数名称。

例如:

originalFile.c contains these functions check0, check1 check2

该脚本将生成这些文件:

originalFile1.c: check0 check1 check2
originalFile2.c: check3 check4 check5
originalFile3.c: check6 check7 check8
... and so on.

现在出现问题......如果我生成了足够多的文件,那么这个数字会达到10,20或者更高,我注意到函数名称中有一些东西。该文件的第一个功能被错误地重命名,但另一个是更正。例如:

originalFileX.c: __check165__ check16 check17
...
originalFileZ.c: __check297__ __check298__ check29 -> in this file 2 names are incorrects.

此外,如果我使用 echo 打印名称,一切都是正确的。你知道什么是错的吗?

这是我的脚本(我在OSX下运行):

#!/bin/bash


NUMCHECK=3

# $1: filename
# $2: number of function in the file
# $3: number of function I want to generate
# $4: function basename
function replace_name() {
  FILE_NUM=$((($3+($2-1))/$2))
  TMP=0
  for (( i=1; i<$FILE_NUM+1; i++ ))
  do
    cp $1.mm test/$1$i.mm

    for (( j=0; j<$2; j++ ))
    do
      OLDNAME="$4$j"
      NEWNAME="$4$TMP"
      echo $OLDNAME:$NEWNAME
      sed -i "" "s/$OLDNAME/$NEWNAME/g" test/$1$i.mm
      TMP=$(($TMP+1))
    done
   done
}

replace_name check $NUMCHECK 60 check

1 个答案:

答案 0 :(得分:1)

您在每个文件中执行3次sed次运行。想象一下以下

sed -i  s/check0/check150/g test/check51.mm
sed -i  s/check1/check151/g test/check51.mm
sed -i  s/check2/check152/g test/check51.mm

  • s/check0/check150/gcheck0更改为check150 - 确定
  • s/check1/check151/g会将之前的check150更改为check15150(因为它也会在check1中找到check150字符串,从上一步开始。< / LI>
  • 等...

您需要更准确地定义正则表达式。因为这里没有任何示例输入,所以无法提供更多帮助。