在特定行号处插入文本


12

我正在开发一个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脚本中实现的任何建议呢?


Answers:


14

您可以在Ex模式下使用Vim:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 选择第3行

  2. i 插入文字和换行符

  3. x 写(如果有)更改并退出

或通过匹配字符串:

ex -s -c '/hello/i|world' -c x file.txt

8

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)。


2
添加bonux替换echo text to insertcat file-to-insert.txt
Archemar

1
至少可以使用bash代替所有这些echo,您可以使用printf '%s\n' 2 a 'text to insert' . wq
evilsoup

6

怎么样:

head -n 2 ./file.txt > newfile.txt
echo "text to insert" >> newfile.txt
tail -n +3 ./file.txt >> newfile.txt
mv newfile.txt file.txt

1
奇怪,但有趣的想法+1
Tyþë-Ø

4
$ awk 'NR==3{print "text to insert"}1' a.txt
01 line
01 line
text to insert
02 line
02 line
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.