【问题标题】:Multiple lines added to vim line by line多行逐行添加到vim
【发布时间】:2021-12-29 15:07:14
【问题描述】:

你能帮忙通过 bash 脚本通过 vim 将多行 txt 添加到文件中吗?

我试过这个:

vim -c "3 s/^/
         add-this-line1
         add-this-line2
         add-this-line3/" -c "wq" /var/www/html/webserver/output_file.txt

但是,文件的输出是这样的:

3 add-this-line1 add-this-line2 add-this-line3 

我想要做的是,从output_file.txt 中的第 3 行,而不是在第 3 行一个接一个地添加行。

【问题讨论】:

  • 如果你真的想用 vim 来做这件事,你可以在Vi and Vim
  • 您能添加一个所需输出的样本吗?

标签: bash vim automation scripting line


【解决方案1】:

这更像是 ,IMO 的工作

seq 10 > file

ed file <<END_ED
3a
first
second
third
.
wq
END_ED

对于ed 的新手,带点的行表示“插入模式”的结束。

file 现在包含:

1
2
3
first
second
third
4
5
6
7
8
9
10

【讨论】:

  • 首先谢谢你,这适用于普通文本。我正在尝试使用此方法将脚本插入另一个脚本,但 ed 在将其附加到另一个脚本之前执行该脚本,因此它写入完全不同的值。你知道我可以通过 ed 或任何其他工具将脚本添加到另一个脚本吗?
  • 你需要确保 here-doc 被引用,这样 shell 就不会碰到它。这很容易做到:引用 here-doc 中的“单词”,如下所示:ed file &lt;&lt; 'END_ED'——这就是您需要做的所有事情。
  • 格伦杰克曼,非常感谢您,先生像梦一样工作!你拯救了我的一天......我是 bash/linux 的新手,我花了相当多的时间来解决这个问题,但我做不到。再次,非常感谢你!
【解决方案2】:

如果你真的想通过 vim 来做,我相信你需要在替换中插入新行:

vim -c "3 s/^/add-this-line1\radd-this-line2\radd-this-line3\r/" -c "wq" /var/www/html/webserver/output_file.txt

【讨论】:

    【解决方案3】:

    使用exed(如果可用/可接受)。

    printf '%s\n' '3a' 'foo' 'bar' 'baz' 'more' . 'w output_file.txt' | ex -s input_file.txt
    

    ex 替换为ed,它应该是相同的输出。


    使用 bash 数组来存储需要插入的数据。

    to_be_inserted=(foo bar baz more)
    
    printf '%s\n' '3a' "${to_be_inserted[@]}" . 'w output_file.txt' | ex -s inputfile.txt
    
    • 再次将 ex 更改为 ed 应该做同样的事情。

    • 如果需要就地编辑input 文件,则删除output_file.txt,只需保留w


    虽然您似乎想从行号"3 s/^/开始的行首插入


    给出运行创建的file.txt

    printf '%s\n' {1..10} > file.txt
    

    一点 shell 脚本就可以解决问题。

    #!/usr/bin/env bash
    
    start=3
    
    to_be_inserted=(
     foo
     bar
     baz
     more
    )
    
    for i in "${to_be_inserted[@]}"; do
      printf -v output '%ds/^/%s/' "$start" "$i"
      ed_array+=("$output")
      ((start++))
    done
    
    printf '%s\n' "${ed_array[@]}" ,p Q | ed -s file.txt
    

    输出

    1
    2
    foo3
    bar4
    baz5
    more6
    7
    8
    9
    10
    

    • 如果需要就地编辑,请将 Q 更改为 w

    • 如果您不想看到输出,请删除 ,p

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      相关资源
      最近更新 更多