【问题标题】:sed command issue with string replacement带有字符串替换的 sed 命令问题
【发布时间】:2017-09-25 12:07:10
【问题描述】:

我在使用 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

【问题讨论】:

    标签: string bash macos shell sed


    【解决方案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(因为它也在上一步中的 check150 中找到了 check1 字符串)。
    • 等等……

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2021-05-16
    • 2021-10-28
    • 2016-10-30
    • 1970-01-01
    • 2018-11-26
    相关资源
    最近更新 更多