shell - 查找单词并替换为文件中的单词

标签 shell awk sed vi replacewith

我的任务是创建一个配置文件。配置文件是一个 JSON 文件。下面的例子

"text": {
        "data": "Click Here",
        "size": 36,
        "style": "bold",
        "name": "text1",
        "hOffset": 250,
        "vOffset": 100,
        "alignment": "center",
        "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
    }

随着 json 的“style”属性的改变重复配置。所以我要将上面的文字复制 50 遍。然后我想用从另一个逗号分隔文件输入的不同样式替换“样式”属性,如下所示。

bold,italic,cryptic

然后输出将是

"text": {
            "data": "Click Here",
            "size": 36,
            "style": "bold",
            "name": "text1",
            "hOffset": 250,
            "vOffset": 100,
            "alignment": "center",
            "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
        }
"text": {
            "data": "Click Here",
            "size": 36,
            "style": "italic",
            "name": "text1",
            "hOffset": 250,
            "vOffset": 100,
            "alignment": "center",
            "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
        }
"text": {
            "data": "Click Here",
            "size": 36,
            "style": "cryptic",
            "name": "text1",
            "hOffset": 250,
            "vOffset": 100,
            "alignment": "center",
            "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
        }

有更简单的方法吗?

最佳答案

gensub 使用 GNU awk 的另一种解决方案:

awk -v RS= '
  NR==FNR { n = split($0, styles, /,/); next } 
  {
    for (i=1; i<=n; i++) {
      style = "\"" styles[i] "\""
      print gensub (/(["]style["]: ).[^,]+/, "\\1" style, "G", $0); 
    }
  }
' style.txt config.file

您从一个名为 style.txt 的文件开始,其中包含所需样式的逗号分隔值。您将它们存储在一个数组中。您继续迭代您的配置文件并换出样式段并将其替换为新模式。

我不愿承认使用 Perl、Ruby 或 Python 的 JSON 解析器可以更好地解析 JSON,但将此作为一次性选项发布,因为您无法控制配置文件。

关于shell - 查找单词并替换为文件中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36853709/

相关文章:

linux - 字符串定界符正在影响其单个字符的某些实例

regex - 句子中的 Sed 或 Awk 或 Perl 替换

python - 在 Python 脚本中循环执行 awk

unix - 从文件中获取模式,与另一个文件的列进行比较,打印匹配的行,使用 awk

linux - 如何在 bash 中使用带有多个斜杠的 sed 命令

linux - 如何在 netcdf 文件中将固定大小的维度转换为无限大小

linux - 使用超时命令时如何获取文件中的日志?

php - 在 www-data (apache2, php) 下启动 shell 进程

java - 如何通过使用 JAVA 中的 pem 文件连接到服务器来跟踪远程服务器中的后端日志

linux - awk 不打印分隔符