【问题标题】:How can I replace only a given key for a specific file in this ad-hoc file format with UNIX tools (sed/awk/etc)?如何使用 UNIX 工具 (sed/awk/etc) 仅替换此 ad-hoc 文件格式中特定文件的给定密钥?
【发布时间】:2021-05-13 07:46:03
【问题描述】:

我想将文件 1 中的 location 值替换为文件 2 中的值。例如,在给出的示例中,location 值应从 24 变为 32,从 25 变为 34。


文件 1:

'location': '24'
'Size':'8'
'location':'25'
'Size':2'

文件 2:

32
34

输出

'location': '32'
'Size':'8'
'location':'34'
'Size':'2'

【问题讨论】:

  • 不要强迫某人在他们知道问题是什么之前点击并阅读正文。 (已编辑以尝试解决该问题)。
  • “文件 2”根本没有位置。还是说Output下面的那个?
  • 除此之外:如果人们要编写用于编辑文件格式的工具,他们需要该格式的规范,而不仅仅是示例,以确保代码是正确的。 (这就是为什么大多数人使用 JSON、YAML 或其他明确指定的格式而不是手动滚动他们自己的格式的部分原因;拥有严格的规范意味着可以对实现的正确性和完整性有信心,并知道哪个当两个组件彼此不兼容时,side 是错误的)。
  • 另外,如果你能展示你尝试过的东西并解释你遇到问题的地方会很好。您可能应该使用awk,并且您可能应该在处理File 1 之前处理File 2,使用FNR == NR 处理来自File 2FNR != NR 的行以处理来自File 1 的行。您将运行awk '…script that you write…' File2 File1 以按File 2 然后File 1 的顺序处理文件。选择不带空格的文件名;他们让生活更轻松。
  • 我不想和sed 一起做。或许可以做到,但绝非易事。

标签: shell unix scripting


【解决方案1】:

首先使用awk 的解决方案

awk -F"'" -v OFS="'" '
        $2 == "location" { getline $4 < "file2" }
        1
' file1

解释:每一行都用分隔符' 分割,在每一行“位置”行上,我们将值(字段$4)替换为从file2 读取的值(getline)。如果 file2 没有足够的值,则该行保持不变。

现在与sed 相同

sed "s/.*/'location':'&'/" file2 \
| sed -e "
        /^'location'/ ! b
        R /dev/stdin
        d
" file1

解释:GNU sed 有一个R command,其工作方式类似于awk 中的getline 命令。我们首先转换 file2 使它的行看起来像 file1(首先是 sed),然后我们将结果通过管道传递给另一个 sed 命令。每次后者看到“位置”行时,它都会将其替换为从stdin 读取的行。这一次,如果 file2 没有足够的值,则删除该行。

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2015-10-28
    • 2016-12-23
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多