在特定行号处插入文本

在特定行号处插入文本

我正在编写一个 bash 脚本,该脚本将根据行中的数据拆分文本文档的内容。

如果原始文件的内容类似于

01 line
01 line
02 line
02 line

如何使用 bash 插入该文件的第 3 行以产生

01 line
01 line
text to insert
02 line
02 line

我希望在我的脚本中使用heredoc或类似的东西来做到这一点

#!/bin/bash

vim -e -s ./file.txt <<- HEREDOC
    :3 | startinsert | "text to insert\n"
    :update
    :quit
HEREDOC

上面的内容当然不起作用,但是我可以在这个 bash 脚本中实施任何建议吗?

答案1

ex您可以通过行号使用 POSIX 工具:

ex a.txt <<eof
3 insert
Sunday
.
xit
eof

或者字符串匹配:

ex a.txt <<eof
/Monday/ insert
Sunday
.
xit
eof

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html

答案2

sed将是一个传统的选择(GNU sed 可能有比这更简单的形式)。

$ cat input
01 line
01 line
02 line
02 line
$ sed '2a\
text to insert
' < input
01 line
01 line
text to insert
02 line
02 line
$ 

或者,非常传统,ed(奖励!就地编辑,没有不可移植的sed -i形式)。

$ (echo 2; echo a; echo text to insert; echo .; echo wq) | ed input
32
01 line
47
$ cat input
01 line
01 line
text to insert
02 line
02 line
$ 

(这与 无关bash。)

答案3

$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line

答案4

请尝试以下操作:

你的原始文件

$ cat <<'EOF' > file.txt
01 line
01 line
02 line
02 line
EOF

使用定界符插入到第 3 行。

$ cat <<'EOF' | sed -i "3r /dev/stdin" file.txt
text to insert
EOF

你得到这个结果

$ cat file.txt
01 line
01 line
text to insert
02 line
02 line

更新:根据@Kusalananda 的评论

相关内容