文件中的复杂字符串替换

时间:2016-04-23 19:52:22

标签: string bash awk replace sed

所以,我在一些数据文件中有一些字符串要替换我正在处理的游戏。我可以使用sedawk。我需要帮助编写bash脚本来替换它,所以这里列出了我想要替换的东西。 (请记住,我将在括号中使用X代替数字,对于字符串1和2,在我需要替换的字符串后面还有一个空格,我也需要替换空格。)

  1. \\P[x]:的每个实例替换为\\n<\\P[x]>\\pf[x]
  2. \\N[x]:的每个实例替换为\\n<\\N[x]>\\af[x]
  3. "volume":80的每个实例替换为"volume":90
  4. ...的每个实例替换为\\..\\..\\..\\.
  5. "]},{"code":401,"indent":0,"parameters":["替换"]},{"code":401,"indent":0,"parameters":["的每个实例(我需要替换的字符串的开头有一个空格,我想把它移到字符串的末尾。)
  6. 以下是我的尝试:

    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 expression#3,char 109:unterminated s&#39;命令

    这是我创建的脚本,无法弄清楚如何让它正常工作:

    #!/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
    

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

1 个答案:

答案 0 :(得分:0)

我认为您在脚本中的unterminated s' command的第五个实例上获得sed,因为您的s'命令以双引号终止,但您的$strb和{{ 1}}字符串中也有未转义的双引号。这是整个脚本的问题,但幸运的是,第五个实例恰好有双引号的奇数,导致语法错误并显示问题。由于您的所有字符串都没有单引号,因此只使用单引号来终止$strr并将所有变量包装在双引号中以保留其文字是一种安全的选择,例如,

sed

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

变化

.

strb='...'

并更改

strb='\.\.\.'

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

有关 strb=' "\]},{"code":401,"indent":0,"parameters":\["' 具有特殊含义的字符的详情,请参阅https://unix.stackexchange.com/a/33005/65267