【问题标题】:Insert specific lines from file before first occurrence of pattern using Sed使用 Sed 在第一次出现模式之前从文件中插入特定行
【发布时间】:2018-10-31 07:22:24
【问题描述】:

我想从一个文件中插入一系列行,比如210,221r 在其他文件中第一次出现模式之前。

由于我显然不是 GNU sed 专家,所以我不知道该怎么做。

我试过了

sed '0,/pattern/{210,221r file
}' bunch_of_files

但显然 file 是从第 210 行读取到 EOF。

【问题讨论】:

    标签: command-line sed text-processing


    【解决方案1】:

    试试这个:

    sed -r 's/(FIND_ME)/PUT_BEFORE\1/' test.text
    
    • -renablesextendend 正则表达式
    • 您要查找的字符串 ("FIND_ME") 在括号内,这会创建一个捕获组
    • \1 将捕获的文本放入替换中。

    关于你的第二个问题:你可以从这样的文件中读取替换*:

    sed -r 's/(FIND_ME)/`cat REPLACEMENT.TXT`\1/' test.text
    

    如果事先将REPLACEMENT.TXT 中的特殊字符替换为sed,那么你就是金子。

    *= 这取决于您的终端模拟器。它适用于 bash。

    【讨论】:

    • 我的问题是 PUT_BEFORE 有几行长并且包含许多需要转义的特殊字符,这就是为什么我想从它已经存在的文件中读取它。我想我可以创建一个仅包含这些行的临时文件并读取它,但我想知道 GNU sed 是否可以读取范围。
    • 谢谢,这很有用,但我刚刚找到了一个答案,可以节省调用catsed 的其他实例的额外费用。我将在下面发布它,但是它还没有解决读取文件的特定行的问题。
    【解决方案2】:

    https://stackoverflow.com/a/11246712/4328188CodeGnome 中给出了一些“sed 黑魔法”:

    为了在模式之前插入文本,您需要在读入文件之前将模式空间交换到保持空间。例如:

    sed '/pattern/ {
         h
         r file
         g
         N
     }' in
    

    但是,要从file 中读取特定 行,可能必须使用类似于 dummy 答案的两次调用解决方案。不过,如果可能的话,我很乐意知道一通电话解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多