多行逐行添加到vim
Posted
技术标签:
【中文标题】多行逐行添加到vim【英文标题】:Multiple lines added to vim line by line 【发布时间】: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问 您能添加一个所需输出的样本吗? 【参考方案1】:这更像是 ed,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 << '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】:使用ex
或ed
(如果可用/可接受)。
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的主要内容,如果未能解决你的问题,请参考以下文章