删除 bash 脚本文件中除最后一次出现的重复变量

Posted

技术标签:

【中文标题】删除 bash 脚本文件中除最后一次出现的重复变量【英文标题】:Remove duplicate variables except last occurrence in bash script file 【发布时间】:2021-03-12 05:43:54 【问题描述】:

我在本地有配置文件,我从不同的远程机器上附加了一些变量。文件内容为:

#!/bin/bash

name=bob
department=(Production)

name=alice
department=(R&D)

name=maggie
department=(Production R&D)

文件中更新的最新值是最后一个。所以配置文件中的预期输出应该是:

#!/bin/bash
name=maggie
department=(Production R&D)

我想删除姓名和地址的前两个数据,除了最后一个。但是只有当有多个相同的变量时才会发生这种情况。

我参考并尝试了这个解决方案,但没有得到预期的输出: https://backreference.org/2011/11/17/remove-duplicates-but-keeping-only-the-last-occurrence/

【问题讨论】:

所以不是追加,而是覆盖文件。 这能回答你的问题吗? How do I delete an exported environment variable? 不清楚您在寻找什么。您能否提供一个示例,说明您在更新前看到的内容以及更新后的预期内容? department=(Production R&D) 是语法错误。你需要一些引号。 is getting appended from the remote hosts where I cannot access the file to overwrite 如果你可以追加(你对文件有写权限),你可以覆盖(在 99.99% 的情况下)。 Appending is done by redirecting the sshpass output the file 太好了!所以不要使用>>,而是使用> 【参考方案1】:

请您尝试以下方法:

tac file | awk '                               # print "file" reversing the line order: last line first
    line = $0                                   # backup the line
    sub(/#.*/, "")                              # remove comments (not sure if comment line exists)
    if (match($0, /([[:alnum:]_]+)=/))         # look like an assignment to a variable
        varname = substr($0, RSTART, RLENGTH - 1)
                                                # extract the variable name (-1 to remove "=")
        if (! seen[varname]++) print line       # print the line if the variable is seen irst time
     else                                     # non-assignment line
        print line
    
' | tac                                        # reverse the lines again

输出:

#!/bin/bash



name=maggie
department=(Production R&D)

请注意,提取变量名的解析器是一个糟糕的解析器。您可能需要根据实际文件调整代码。

【讨论】:

感谢您的反馈。您不能使用重定向覆盖文件。请重定向到另一个文件名,例如file2,然后将其重命名为mv -f file2 file。祝你好运!

以上是关于删除 bash 脚本文件中除最后一次出现的重复变量的主要内容,如果未能解决你的问题,请参考以下文章

Bash:将变量插入到 curl 调用中不起作用[重复]

Bash:如何使用 sed 仅替换文件中的最后一次出现?

删除 bash 脚本中除了最新的 3 个文件之外的所有文件

Pyspark - 从数据框中删除重复项,保持最后一次出现

按内容从bash数组中删除元素(存储在变量中)而不留下空白槽[重复]

删除固定宽度文件中的重复项,该文件除最后一次出现外具有多个键列