【问题标题】:sed - replace only 1 instance and delete the restsed - 仅替换 1 个实例并删除其余实例
【发布时间】:2014-12-08 19:46:09
【问题描述】:

我目前有以下命令代码块,它将比较两个文字字符串,如果它们不相等,则将其替换为预期的内容。虽然如果实际字符串只有一个实例,这会非常有效,但我该如何改进它,以便它只会替换第一个发现并删除其他发现?

if [ "$actualString" != "$expectedString" ]; then
    sed -i 's|$actualString|$expectedString|g' /tmp/test
fi

编辑:我将处理 ssh 键,因此 $actualString 将是一个键,或者在多次出现的情况下,不同行上有多个键。比如:

key user1@host1
key user2@host2
key user1@host1
key user3@host3
key user1@host1

我只想将具有 user1@host1 的第一个实例替换为“monkey user1@host1”,然后删除其余实例。我正在寻找要更新的文件

monkey user1@host1
key user2@host2
key user3@host3

【问题讨论】:

  • sed 命令中使用单引号意味着$actualString$expectedString 的值不会被扩展。也许你应该更新你的问题。另外,您是在询问同一行上的多个实例,还是在不同行上出现的情况?
  • 根据请求更新。
  • 您是否按照建议尝试了我的 perl 命令?
  • 我做到了。如何获取它来更新实际文件?

标签: bash sed


【解决方案1】:

使用perl -0 更容易做到这一点,它可以一次性吞下整个文件:

perl -0pe "s|$actualString|$expectedString|; s|$actualString||g"

【讨论】:

    【解决方案2】:

    如果您只是想保存第一次出现的重复用户,请删除其余部分并添加猴子:

    sort -u inputfile.txt | sed -e "0,/$(sort inputfile.txt | uniq -d)/s/^key /monkey /"
    

    替换sed -i 替换sed -e 以在原地编辑文件(或sed -i.bak 以在原地编辑时在inputfile.txt.bak 中创建原始文件的备份。)

    输出:

    $ sort -u dat/keys.txt | sed -e "0,/$(sort dat/keys.txt | uniq -d)/s/^key /monkey /"
    monkey user1@host1
    key user2@host2
    key user3@host3
    

    注意:这假定有一个重复的用户。对于其他重复项,需要保留 uniq -d 的结果数组。

    【讨论】:

      【解决方案3】:

      考虑以下

      key user1@host1
      key user2@host2
      key user1@host1
      key user3@host3
      key user1@host1
      key user2@host2
      key user3@host3
      key user1@host1
      key user1@host2
      

      找到key user1@host1的第一次出现并更改它,然后删除其余重复项:

      sed -e '0,/key user1@host1/s/key user1@host1/............../' -e '/key user1@host1/d' 'my_file'
      

      输出

      ..............
      key user2@host2
      key user3@host3
      key user2@host2
      key user3@host3
      key user1@host2
      

      【讨论】:

      • 输出很多但没什么用
      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 2015-01-17
      • 2022-11-13
      • 2012-04-06
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多