我正在编写一个 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 的评论