Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 文件中复杂的字符串替换_String_Bash_Awk_Replace_Sed - Fatal编程技术网

String 文件中复杂的字符串替换

String 文件中复杂的字符串替换,string,bash,awk,replace,sed,String,Bash,Awk,Replace,Sed,所以,我有一些字符串要在我正在制作的游戏的一些数据文件中替换。我可以使用sed或awk。我需要帮助编写bash脚本来替换它,下面是我要替换的东西的列表。(请记住,我将使用括号中的X来代替数字,同样,对于字符串1和2,在需要替换的字符串后面有一个空格,我也需要替换空格。) 将\\P[x]:的每个实例替换为\\n\\pf[x] 将\\N[x]:的每个实例替换为\\N\\af[x] 将“卷”:80的每个实例替换为“卷”:90 将..的每个实例替换为\\\\\\\\\\\\\\\\\\. 将“]}、{“

所以,我有一些字符串要在我正在制作的游戏的一些数据文件中替换。我可以使用
sed
awk
。我需要帮助编写bash脚本来替换它,下面是我要替换的东西的列表。(请记住,我将使用括号中的X来代替数字,同样,对于字符串1和2,在需要替换的字符串后面有一个空格,我也需要替换空格。)

  • \\P[x]:
    的每个实例替换为
    \\n\\pf[x]
  • \\N[x]:
    的每个实例替换为
    \\N\\af[x]
  • “卷”:80的每个实例替换为
    “卷”:90
  • ..
    的每个实例替换为
    \\\\\\\\\\\\\\\\\\.
  • “]}、{“code”:401,“indent”:0,“parameters”:[“
    替换为
    “]}、{“code”:401,“indent”:0,“parameters”:[“
    ”(需要替换的字符串开头有一个空格,我想将其移动到字符串末尾。)
  • 以下是我尝试过的:

    sed -e 's/"volume":80/"volume":90/g' -e 's///g' -e 's/\ \"]},{\"code\":401,\"indent\":0,\"parameters\":[\"/\"]},{\"code\":401,\"indent\":0,\"parameters\":[\"\ /g' < ${file} > ${outdir}/${filename}.${extension}
    
    sed-e's/“volume”:80/“volume”:90/g'-e's///g'-e's/\\\”],{\'code\':401,\'indent\':0,\'parameters\':[\'/\'],{\'code\':401,\'indent\':0,\'parameters\:[\'${file}>${outdir}/${filename}.{扩展名}
    
    我得到这个错误:`sed:-e表达式#3,char 109:unterminated s'命令

    这是我创建的一个脚本,我不知道如何让它正常工作:

    #!/bin/bash
    direct=./1
    outdir=./2
    mkdir -p $direct
    mkdir -p $outdir
    for file in ${direct}/*.*; do
      filepath=$(basename "$file")
      extension="${filepath##*.}"
      filename="${filepath%.*}"
      strb='"volume":80'
      strr='"volume":90'
      echo 1 && sed -e "s#\"${strb}\"#\"${strr}\"#g" -i ${file}
      strb='...'
      strr='\\..\\..\\..\\.'
      echo 2 && sed -e "s#\"${strb}\"#\"${strr}\"#g" -i ${file}
      num=0
      while [ "$num" -le "99" ]; do
        strb='\\P['"$num"']\: '
        strr='\\n<\\P['"$num"']>\\pf['"$num"']'
        sed -e "s#\"${strb}\"#\"${strr}\"#g" -i ${file}
        strb='\\N['"$num"']\: '
        strr='\\n<\\N['"$num"']>\\af['"$num"']'
        sed -e "s#\"${strb}\"#\"${strr}\"#g" -i ${file}
        num=$(echo $num+1 | bc -l)
      done
      strb=' "]},{"code":401,"indent":0,"parameters":["'
      strr='"]},{"code":401,"indent":0,"parameters":[" '
      echo 5 && sed -e "s#\"${strb}\"#\"${strr}\"#g" -i ${file}
      strb='Move1'
      strr='Move'
      echo 6 && sed -e "s#\"${strb}\"#\"${strr}\"#g" -i ${file}
      strb='Move'
      strr='Move1'
      echo 7 && sed -e "s#\"${strb}\"#\"${strr}\"#g" -i ${file}
      echo ${filename}.${extension}
    done
    
    !/bin/bash
    直接=./1
    outdir=/2
    mkdir-p$direct
    mkdir-p$outdir
    对于${direct}/*.*中的文件,请执行以下操作
    文件路径=$(基本名称“$文件”)
    extension=“${filepath##*.}”
    filename=“${filepath%.*}”
    strb=““体积”:80”
    strr=““音量”:90”
    echo 1&&sed-e“s${strb}\”${strr}\“{strr}\”g“-i${file}
    strb='…'
    strr='\\\\\\\\\\\\\\\\\\\\\\\\.'
    echo 2&&sed-e“s${strb}\”${strr}\“{strr}\”g“-i${file}
    num=0
    而[“$num”-le“99”];则
    strb='\\P['$num']\:'
    strr='\\n\\pf['$num']
    sed-e“s#\”${strb}\“${strr}\”\g“-i${file}
    strb='\\N['$num']\:'
    strr='\\n\\af['$num']
    sed-e“s#\”${strb}\“${strr}\”\g“-i${file}
    num=$(echo$num+1 | bc-l)
    完成
    strb='“]},{“代码”:401,“缩进”:0,“参数”:[“'
    strr='“]},{“代码”:401,“缩进”:0,“参数”:[“'
    echo 5&&sed-e“s#\”${strb}\“${strr}\”g“-i${file}”
    strb='Move1'
    strr='Move'
    echo 6&&sed-e“s#\”${strb}\“${strr}\”g“-i${file}”
    strb='Move'
    strr='Move1'
    echo 7&&sed-e“s#\”${strb}\“${strr}\”\g“-i${file}
    echo${filename}.${extension}
    完成
    

    在sed的第五个实例中,我得到了
    unterminated s'命令

    我想在脚本中的
    sed的第五个实例中得到了
    unterminated s'命令
    ,因为你的
    s'
    命令以双引号终止,但是你的
    $strb
    $strr
    字符串也有未替换的双引号引号。这对整个脚本来说是个问题,但幸运的是,第五个实例恰好有奇数个双引号,这导致了语法错误并暴露了问题。因为您的字符串都没有单引号,所以只使用单引号终止
    sed
    ,并将所有变量用双引号包装到pres注意他们的文字是安全的,例如

    sed -e 's#'"${strb}"'#'"${strr}"'#g' -i ${file}
    
    您的字符串中还有一些
    []
    和一些
    。它们对sed有特殊的意义,因此您应该对它们进行转义(对于模式,而不是替换),例如

    改变

    strb='...'
    

    改变

    strb=' "]},{"code":401,"indent":0,"parameters":["'
    


    有关对
    sed

    具有特殊意义的字符的详细信息,请参阅。这可能有点乏味,但实际上很简单。您是否查找了
    sed
    的替代命令?这是为了获得编程帮助,而不是要求他人为您编写代码的地方。请使用您尝试过的一些代码改进您的问题,您的input和output示例,以及任何相关的错误消息。@CodeGnome添加了脚本,当你被问到是否查找了sed的替代命令时,你口齿不清地说
    nope
    ,这种态度和缺乏努力使很多人拒绝帮助你,因此出现了反对票和接近票。你为什么说你不费心去帮助你当您已经使用它编写了一个脚本时,请查看它?现在可能已经太晚了,但是如果您再次询问您的问题,以包含简明、可测试的示例输入和预期输出,那么我们将有必要的信息来开始尝试帮助您(如果有人还在看这个问题)。
    strb=' "]},{"code":401,"indent":0,"parameters":["'
    
     strb=' "\]},{"code":401,"indent":0,"parameters":\["'