gpt4 book ai didi

awk - sed 查找正则表达式模式,然后查找下一个正则表达式模式(可变多行)并替换

转载 作者:行者123 更新时间:2023-12-02 18:46:47 25 4
gpt4 key购买 nike

我正在尝试找到一种使用 sed 将字符串“.sh”插入文本文件中的特定行的方法。我遇到的问题是,我只想在先前的正则表达式匹配时插入字符串,它还必须支持“名称”和“扩展名”标记之间的可变行数并且是幂等的,因此我可以多次运行它对于“扩展名”标记的空格分隔列表,仅插入一次“.sh”。

这是文本文件的一小段:-

    <name>gba</name>
<fullname>Game Boy Advance</fullname>
<manufacturer>Nintendo</manufacturer>
<release>2001</release>
<hardware>portable</hardware>
<path>/storage/roms/gba</path>
<extension>.gba .GBA .zip .ZIP .7z .7Z</extension>

所以我想改变<extension>.gba .GBA .zip .ZIP .7z .7Z</extension><extension>.gba .GBA .zip .ZIP .7z .7Z .sh</extension>仅当姓名标签为 <name>gba</name>

这是我迄今为止想到的最好的方法,但它有两个问题,首先,代码的后续执行会重复插入,其次是固定行数(6),但情况可能并不总是如此:-

sed -i '/<name>gba<\/name>/{n;n;n;n;n;n;s/<\/extension>/ .sh<\/extension>/}' /tmp/test.txt

最佳答案

使用 GNU sed 进行测试(语法可能因其他实现而异):

sed '/<name>gba</,/<extension>/{/<extension>/{/\.sh/! s/<\/extension>/ .sh&/}}'
  • /<name>gba</,/<extension>/这将匹配以包含 <name>gba< 的行开头的行范围并以包含 <extension> 的行结尾
    • 这是基于给定的示例,如果您需要更强大的匹配条件,您可以修改正则表达式
  • {}有助于对仅针对给定匹配条件执行的命令进行分组
  • 对于这样的行范围:
    • /<extension>/仅匹配这一行
    • /\.sh/!检查它是否没有.sh
    • s/<\/extension>/ .sh&/添加.sh对于这样的行

关于awk - sed 查找正则表达式模式,然后查找下一个正则表达式模式(可变多行)并替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67333959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com