【问题标题】:How to use sed to replace the last occurrence of a string in a file如何使用 sed 替换文件中最后一次出现的字符串
【发布时间】:2022-11-22 01:22:28
【问题描述】:

我有一个包含以下内容的文本文件:

--abcdef12 --  
February April January    
January March January   
January January January   
--abcdef12 --  

如何使用 sed 将文件中最后一次出现的一月更改为七月?
所需的输出:

--abcdef12 --  
February April January   
January March January   
January January July  
--abcdef12 --  

我试过 https://linuxhint.com/use-sed-replace-last-occurrence/ - 下面是输出:

sed '$ s/January/July/' test.txt  
--abcdef12 --  
February April January  
January March January  
January January January  
--abcdef12 --  

也试过 https://unix.stackexchange.com/questions/187889/how-do-i-replace-the-last-occurrence-of-a-character-in-a-string-using-sed - 下面是输出:

sed 's/\(.*\)January/\1July/' test.txt  
--abcdef12 --  
February April July  
January March July   
January January July  
--abcdef12 --  

我也很想知道为什么以上两个选项不起作用!

【问题讨论】:

  • sed 逐行工作,因此 sed 's/(.*)January/\1July/' test.txt 在每行中找到最后一次出现的 Januarysed '$ s/January/July/'在最后一行搜索January,那里没有January。如果您的 sed 是 GNU,请使用 sed -z 's/\(.*\)January/\1July/' file.txt
  • 谢谢!如何使其内联并更新同一文件? -i 选项似乎不能与 -z 一起使用。 sed:-e 表达式 #1,字符 42:“s”命令的 RHS 上的无效引用 \1
  • 如果我使用相同的文件,使用 tee 或 > 重定向会给我一个空文件。否则我必须保存到临时文件中并将其复制回来。

标签: sed


【解决方案1】:

使用 GNU sed

$ sed -Ezi.bak 's/(.*)January/July/' input_file
$ cat input_file
--abcdef12 --
February April January
January March January
January January July
--abcdef12 --

-i.bak 创建扩展名为.bak 的原始文件的备份

$ cat input_file.bak
--abcdef12 --
February April January
January March January
January January January
--abcdef12 --

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2021-12-05
    • 2011-04-19
    • 2017-07-13
    • 2011-07-26
    相关资源
    最近更新 更多