【问题标题】:Shell script: Insert multiple lines into a file ONLY after a specified pattern appears for the FIRST time. (The pattern appears multiple times)Shell 脚本:仅在第一次出现指定模式后才在文件中插入多行。 (图案出现多次)
【发布时间】:2021-10-12 14:25:08
【问题描述】:

我想使用 shell 脚本在一个文件中插入多行。让我们考虑一下我的原始文件:original.txt:

aaa
bbb
ccc
aaa
bbb
ccc
aaa
bbb
ccc
.
.
.

还有我的插入文件:toinsert.txt

111
222
333

现在我必须在“original.txt”文件中第一次出现“ccc”行之后插入“toinsert.txt”文件中的三行。注意:“ccc”模式在我的“original.txt”文件中出现了不止一次。仅在模式第一次出现后插入后,我的文件应更改如下:

aaa
bbb
ccc
111
222
333
aaa
bbb
ccc
aaa
bbb
ccc
.
.
.

我应该使用 shell 脚本进行上述插入。有人可以帮我吗?

注2:我发现了一个类似的案例,有部分解决方案:

sed -i -e '/ccc/r toinsert.txt' original.txt

实际上是多次插入(每次出现 ccc 模式时)。

【问题讨论】:

  • 当您的问题与 PowerShell 无关时,能否删除 PowerShell 标签?如果是,您应该详细说明一下。提前致谢。 ;-)
  • 正如 Olaf 所说,您在寻找 Powershell 或 shell 解决方案吗?
  • 完成。删除了 PowerShell 标记。我正在寻找一个 Shell 脚本解决方案。谢谢!

标签: bash shell sed ed


【解决方案1】:

使用ed,而不是sed,来编辑文件:

printf "%s\n" "/ccc/r toinsert.txt" w | ed -s original.txt

它在包含ccc 的第一行之后插入另一个文件的内容,但与您的sed 版本不同,它只在第一行之后。

【讨论】:

    【解决方案2】:

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

    sed '0,/ccc/!b;/ccc/r insertFile' file
    

    使用范围:

    如果当前行在第一次出现 ccc 之后的范围内,则中断进一步处理并像往常一样隐式打印。

    否则,如果当前行包含ccc,则插入来自insertFile 的行。

    注意这使用地址0,它允许正则表达式出现在第 1 行,并且特定于 GNU sed。

    或:

    sed -e '/ccc/!b;r insertFile' -e ':a;n;ba' file
    

    使用循环:

    如果一行不包含ccc,则不做进一步处理,照常打印。

    否则,从insertFile 插入行,然后使用循环,获取/打印剩余的行,直到文件末尾。

    注意r 命令坚持用换行符与其他 sed 命令分隔。 -e 选项模拟了这种效果,因此 sed 命令分为两个 -e 选项。

    或:

    sed 'x;/./{x;b};x;/ccc/!b;h;r insertFile' file
    

    使用标志:

    如果保持空间不为空(标志已设置),则不再进行进一步处理并照常打印。

    否则,如果该行不包含ccc,则不做进一步处理,照常打印。

    否则,将当前行复制到保留空间(设置标志)并从insertFile插入行。

    注意在所有情况下,r 命令都会在打印当前行之后插入来自insertFile 的行。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2013-11-25
      • 2014-04-25
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多