【问题标题】:inserting contents of one text file into another in bash [duplicate]在bash中将一个文本文件的内容插入另一个文本文件[重复]
【发布时间】:2021-06-10 22:43:07
【问题描述】:

我想将一个文本文件的内容(带有换行符)插入另一个文本文件的预定位置(在某个字符串之后): 我尝试了以下方法: 基础文件:

cat base
ONE
TWO
THREE

扩展名:

cat ext
100
200
300
400
500
600
700
800
900
A00
B00
C00
D00

以及我尝试过的脚本:

#!/bin/bash
ext=$(<ext)
sed -i "s/TWO/TWO\n$ext/" base

这给了我 sed: -e expression #1, char 14: unterminated `s' command

【问题讨论】:

    标签: linux bash sed


    【解决方案1】:

    如果你想直接编辑它一个文件,我总是建议ed 而不是非标准的sed -i (其中支持它的sed 的不同实现行为不同,这里有一个常见的问题来源):

    printf "%s\n" "/TWO/r ext" w | ed -s base
    

    将在base中包含TWO的第一行之后插入文件ext的内容,然后w将新版本的base写回磁盘。

    如果您必须使用sed,正确的调用看起来会非常相似(毫不奇怪,因为它们是同级命令):

    sed -i '/TWO/r ext' base
    

    (不过,这将在 两个之后插入 ext 文件,而不仅仅是第一个。)

    两者的关键是r 命令,它r读取给定文件的内容并将其插入到具有匹配地址的行之后。比尝试将文件内容读入变量并直接在ed/sed 命令中包含文本要好得多。


    如果要在行后插入变量的内容,可以使用

    printf "%s\n" "/TWO/a" "$ext" . w | ed -s base
    

    (只要变量没有只有句点的行)

    或使用 GNU sed

    sed -i "/TWO/a ${ext//$'\n'/\\\n}" base
    

    a在寻址行之后追加文本。

    【讨论】:

      【解决方案2】:

      虽然 Shawn 给出的答案显示了一个可能的解决方案,但它并没有解释为什么您的尝试没有奏效。

      请注意,您的变量 ext 包含换行符。因此,sed 在这里看到了物理换行。在命令行(两行行)输入时,您会收到相同的错误消息:

      sed -i "s/TWO/TWO\nfoo
      /" base
      

      【讨论】:

        【解决方案3】:

        这可能对你有用(GNU sed):

        sed -e '0,/TWO/{/TWO/r extFile' -e '}' baseFile
        

        这会将文件extFile 放在字符串TWO 的第一次出现之后。 -i 选项可用于修改文件。

        另一种解决方案:

        sed -e '/TWO/!b;r extFile' -e ':a;n;ba' baseFile
        

        注意使用-e 选项在r filename 命令之后拆分命令。 r 后面必须跟一个换行符,-e 在一行上模拟这一点。

        如果您想在每次出现字符串TWO 之后插入文件,那么只需使用(正如 Shawn 已经解释过的):

        sed '/TWO/r extFile' baseFile
        

        【讨论】:

          猜你喜欢
          • 2019-07-16
          • 2013-04-26
          • 2013-05-24
          • 2011-04-16
          • 1970-01-01
          • 2014-01-19
          • 1970-01-01
          • 1970-01-01
          • 2017-04-23
          相关资源
          最近更新 更多