【问题标题】:Complicated string replacement in files文件中复杂的字符串替换
【发布时间】:2016-08-17 08:58:19
【问题描述】:

所以,对于我正在开发的游戏,我需要在一些数据文件中替换一些字符串。我可以使用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":["的每个实例(字符串的开头有一个空格我需要替换,我想把它移到字符串的末尾。)

这是我尝试过的:

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' command

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

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

【问题讨论】:

  • 这可能有点乏味,但实际上很简单。你查到sed的替代命令了吗?
  • SO 是为编程提供帮助,而不是要求其他人为您编写代码的地方。请使用您尝试过的一些代码、输入和输出示例以及任何相关的错误消息来改进您的问题。
  • @CodeGnome 添加了脚本
  • 当你被问到是否查找过 sed 的替代命令时,你轻率地说 nope 这种态度和缺乏努力让很多人不愿帮助你,因此遭到了反对和反对票数接近。为什么你说你已经用它写了一个脚本时不费心去研究它?现在可能为时已晚,但如果您再次edit 您的问题包括简洁、可测试的样本输入和预期输出,那么我们将有必要的信息开始尝试帮助您(如果有人仍在查看此问题)。跨度>

标签: string bash awk replace sed


【解决方案1】:

我认为您在脚本中的 sed 的第五个实例上得到了 unterminated s' command,因为您的 s' 命令以双引号终止,但您的 $strb$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":\["'

有关对sed 具有特殊含义的字符的更多信息,请参阅https://unix.stackexchange.com/a/33005/65267

【讨论】:

    猜你喜欢
    • 2017-09-17
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2021-04-07
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多