多行逐行添加到 vim

Multiple lines added to vim line by line

能否通过 vim 脚本通过 bash 脚本将多行 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 

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

这更像是 、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

exed 如果 available/acceptable。

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

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

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