如何在特定行号处插入行
1. 概述
假设我们需要在一个大文件的特定行插入一些数据。由于它的大小,在编辑器中打开它并手动添加它会花费很多时间。此外,可能很难滚动到正确的行。
在本教程中,我们将了解如何使用 Linux 命令在文件的特定行插入文本。我们将研究 允许我们修改和操作文本文件的ed 、sed 、awk 、perl 和ex 命令。我们还将看到如何使用head 、tail 和echo 命令的组合来实现这一点。
2. 使用ed
假设我们有一个名为File1的文件,其中包含:
$ cat File1
Line #1
Line #2
Line #3
Line #4
我们想在File1的第三行插入一些文本。让我们看看它是如何使用ed命令完成的:
$ ed File1
32
我们可以看到ed正在显示文件中的字符数。请注意,在32之后没有提示。这是因为ed是一个交互式行编辑器。因此,ed等待我们输入进一步的指令。
默认情况下,ed指向文件的最后一行,ed中的每个命令都将在当前行上运行。因此,ed默认将命令应用到最后一行。现在,让我们指定行号和命令:
3i
New Line with ed
让我们看看3i是什么意思。数字 3 指定我们要插入文本的行。然后,我启用插入模式。下一行是我们要插入的文本。我们可以添加一行或几行。
在所有输入之后,我们应该保存更改并退出:
.
w
q
让我们看看这些参数是什么。这 ‘。’ 完成输入模式。然后我们输入w来编写更改。最后,我们插入q以退出ed 。让我们使用*cat *命令查看修改文件的内容:
$ cat File1
Line #1
Line #2
New Line with ed
Line #3
Line #4
请注意,我们可以制作一个编辑脚本,而不是手动在此交互式 shell 中输入数据。然后,将它们放在一个单独的文件中。让我们写这个脚本:
$ cat script.ed
3i
New Line with ed
.
w
q
script.ed脚本包含我们使用过的所有指令。现在,我们可以将脚本重定向为ed编辑器的输入:
$ ed File1 < script.ed
32
49
让我们看看输出中的这些数字是什么。数字 32 是编辑前File1中的字符数,49 是应用脚本后文件中的字符数。这样我们就可以确定的知道我们的数据插入正确了。
3. 使用sed
sed 命令是用于在 Linux 中编辑文件的强大实用程序。它提供了很多对文件的操作。在本节中,我们将像使用ed一样在File1的第三行插入文本,但这次使用 GNU sed。sed命令 是基于ed创建的,但与此不同的是,它不能交互使用。实际上,我们将在同一行中设置修改命令:
$ sed '3 i New Line with sed' File1
Line #1
Line #2
New Line with sed
Line #3
Line #4
让我们看看我们在单引号中做了什么。首先,我们添加了用于插入的行号。i与ed中的一样,启用 sed 的插入模式。最后,我们设置新行的内容。请注意,引号中任何元素之间的空格都不是必需的。例如,我们可以将示例中的短语更改为*“3iNew Line with sed”*,并获得与上述相同的结果。
现在,如果我们打印File1,我们会看到文件还没有改变:
$ cat File1
Line #1
Line #2
Line #3
Line #4
使用ed的更改将直接保存到输入文件,但使用sed,我们需要一个选项来将结果保存到主文件。*通过为sed使用-i选项,我们可以将更改直接应用于文件。*如果我们不使用此选项,sed只会在终端上打印更改。让我们将-i添加到我们之前的命令中:
$ sed -i '3 i New Line with sed' File1
请注意,-i选项仅适用于 GNU sed 。
如果我们看一下File1的内容,我们可以看到新行已成功插入:
$ cat File1
Line #1
Line #2
New Line with sed
Line #3
Line #4
如果我们不想更改输入文件,我们可以使用重定向将输出保存到新文件。在这种情况下,我们不需要使用*-i*选项:
$ sed '3 i New Line with sed' File1 > sed_out
如果我们查看sed_out文件的内容,我们可以看到结果与之前相同:
$ cat sed_out
Line #1
Line #2
New Line with sed
Line #3
Line #4
需要注意的是,sed是最常用的插入方式。尽管如此,了解其他选择还是有好处的。
4. 使用awk
awk 是一种非交互式可编程编辑器,可以逐行读取输入。默认情况下, awk一次读取一行。此外,它还可以读取包含多行的记录。
awk提供了一种类似于 C 的编程语言来编写用于行编辑的脚本。与sed一样,awk起源于ed。与前面的示例类似,让我们将文本添加到file1的第三行:
$ awk 'NR==3{print "New Line with awk"}1' File1
Line #1
Line #2
New Line with awk
Line #3
Line #4
在引号内,我们有条件*{action}对。在条件部分,我们使用awk NR*(记录数)变量来指定行号。动作部分应该在大括号 ({}) 中,并且只会应用于我们在条件中提到的行地址。为了处理,awk检查条件,如果为真,它将执行操作部分。
在awk中,没有像sed -i选项那样的选项可以将结果保存到输入文件。我们可以重定向标准输出(>) 以将结果保存在一个新文件中:
$ awk 'NR==3{print "New Line with awk"}1' File1 > awk_out
请注意,我们使用*==指定了行号。另请注意,引文末尾的1等同于true*。它可以是任何非零数字。我们应该在大括号中的操作部分之后放置任何非零数字,以便awk为每一行执行默认操作打印。否则,awk默认考虑0或false ,只打印新行并忽略file1的内容。让我们打印awk_out文件:
$ cat awk_out
Line #1
Line #2
New Line with awk
Line #3
Line #4
请注意,使用awk我们无法将结果保存回输入文件。但是从 4.1.0 版开始,gawk (GNU awk ) 命令支持*-i*选项。
5. 使用perl
perl是一个非交互式命令,如sed和awk。为此,我们需要结合使用选项和 if 语句来将新行插入到File1 中。让我们看看它是如何工作的:
$ perl -e 'print "New Line with perl" if $. == 3' File1
该选项告诉perl执行单引号中的命令。在引用中,我们要求perl在到达第三行时打印短语*“New Line with perl” 。if 模式中的搜索是使用 $ 完成的。具有当前行号的符号。
与其他命令不同,perl默认不打印结果。因此,我们可以添加*-p*选项来打印 File1 的所有行。这使我们能够检查更改是否正确:
$ perl -p -e 'print "New Line with perl" if $. == 3' File1
Line #1
Line #2
New Line with perlLine #3
Line #4
我们可以看到perl几乎达到了预期的结果,但它没有在插入的文本后添加新行( \n )。为此,我们可以将*\n添加到我们的短语中并将其更改为“New Line with perl\n”。但我们也可以**使用perl的-l选项在新行的末尾自动添加\n*:**
$ perl -l -p -e 'print "New Line with perl" if $. == 3' File1
Line #1
Line #2
New Line with perl
Line #3
Line #4
与sed一样,perl有*-i*选项来保存更改:
$ perl -i -l -p -e 'print "New Line with perl" if $. == 3' File1
现在,让我们使用输出重定向将修改保存到一个新文件中:
$ perl -l -p -e 'print "New Line with perl" if $. == 3' File1 > perl_out
最后,让我们看看生成的文件:
$ cat perl_out
Line #1
Line #2
New Line with perl
Line #3
Line #4
6. 使用ex
ex实用程序是一个面向行的交互式文本编辑器,与ed一样,它源自vi 。我们将使用ex向file1添加一行。所以,让我们先用ex打开文件:
$ ex File1
当我们用ex打开一个文件时,会打开一个新窗口,我们应该在那个窗口中添加我们的命令。所以,不会有提示。在打开的窗口中,我们看到一些行:
"File1" 4L, 32C
Entering Ex mode. Type "visual" to go to Normal mode.
:
这些行是关于输入文件的一些信息。第一行包括输入文件中的行数和字符数。第二行说,如果我们键入visual,我们可以看到文件内容并手动编辑文件。注意第三行的分号。编辑器在每个命令行的开头放置了一个分号。
对于插入, ex的语法类似于ed编辑器。让我们看看它是如何工作的:
3 insert
New Line with ex
.
xit
在第一行中,我们添加了用于插入的行号。其次,我们在同一行中指定了insert操作。然后,在下一行中,我们添加了我们想要插入的短语。最后,我们需要打一个点(.)来结束输入模式,然后添加xit来保存更改并退出编辑器。
使用ex,结果将保存在原地。因为它是一个交互式编辑器,它允许我们更改输入文件,然后使用xit保存更改。所以,如果我们cat File1,我们可以看到ex成功插入了数据:
$ cat File1
Line #1
Line #2
New Line with ex
Line #3
Line #4
7.使用 head tail的组合
让我们结合使用head、tail 和echo命令来插入一个新行:
$ { head -n 2 File1; echo "New Line"; tail -n +3 File1; }
Line #1
Line #2
New Line
Line #3
Line #4
首先,我们使用大括号 ({}) 对命令进行分组。其次,我们在每个命令的末尾使用分号来指定其结束。请注意,我们需要在第三行插入一个新行。因此,我们使用head命令打印File1的前两行。然后,我们使用echo命令打印新行。最后,我们使用tail命令打印输入文件的其余部分,从第 3 行开始。让我们将输出保存在一个新文件中:
$ { head -n 2 File1; echo "New Line"; tail -n +3 File1; } > out
最后,我们将所有更改重定向到out文件。如果我们查看输出文件,我们可以看到我们得到了与之前相同的结果:
$ cat out
Line #1
Line #2
New Line
Line #3
Line #4