如何将字符串插入文件的倒数第二行

时间:2017-08-03 12:11:59

标签: bash awk sed

我有一个关于如何将字符串插入文件的倒数第二行的问题。

例如:

$ cat diff_a.txt
students
teacher
mike
john

$ cat diff_b.txt
python
bash shell
Java

预期结果应为:

$ cat diff_b.txt
python
bash shell
mike
Java

如果我使用以下命令,它会将字符串“mike”追加到diff_b.txt的最后一行

$ grep mike diff_a.txt >> diff_b.txt
$ cat diff_b.txt
python
bash shell
Java
mike

问题:

How should I put "mike" into second to last line of diff_b.txt ?

6 个答案:

答案 0 :(得分:6)

您可以使用@import '~normalize.css/normalize.css'; 在特定行之前插入一行,并指明它的位置:

sed

将在第四行插入“我的新行”

您可以使用sed '4i\My New Line\' my_file.txt 获取文件中的行数:

wc -l

直接回答您问题的完整示例:

$ wc -l < my_file.txt
5
  • 添加$ cat my_file.txt Hello World There is another line $ sed -i "`wc -l < my_file.txt`i\\My New Line\\" my_file.txt $ cat my_file.txt Hello World My New Line There is another line 以便sed实际编辑文件
  • 使用双引号,否则不会在单引号内执行替换和扩展。
  • 转义-i

答案 1 :(得分:2)

将任何命令(例如grep mike diff_a.txt)的输出读入diff_b.txt的倒数第二行:

ed -s diff_b.txt <<< $'$-1r !grep mike diff_a.txt\nwq'

这会将ed置于脚本模式,然后将命令提供给它,就好像它们被输入为输入一样:

  • $' ... ' - 引用的字符串:
  • $-1r - $最后一行减1,r来自:
  • ! grep ... - shell命令grep ...
  • \n - 使用回车结束r命令
  • wq - w rite(保存文件)和q uit ed

如果您已经知道要插入的文本,这对您的示例来说要简单得多:

ed -s diff_b.txt <<< $'$-1a\nmike\n.\nwq'

这里我们使用a append命令(以回车符结束),输入mike文本(以回车符结束),然后退出a追加模式{ {1}}(以回车符结束),然后保存并退出。

答案 2 :(得分:1)

我有一个python解决方案。使用readlines将文件中的行读入列表,然后插入值。

import re
import sys

file_name = sys.argv[1]
fp = open(file_name)
lines = fp.readlines()
your_output = lines.insert(len(lines)-1,"insert text") # you can also use sys.argv[2] if you want two inputs, first is file_name (also accepts file path), second can be your insert text

答案 3 :(得分:1)

一种hacky解决方案,但您可以使用head的负线计数来获取除最后一行之外的所有行,插入新行,然后使用tail来获取最后一行原始文件。您必须先将输出重定向到临时文件,然后覆盖原始文件。

 ( head -n -1 diff_b.txt
 echo "mike"
 tail -n 1 diff_b.txt ) > tmp.txt
 mv tmp.txt diff_b.txt

答案 4 :(得分:1)

  

从文件中grep一行并插入到倒数第二个位置到另一个文件

如果你没有特殊的字符......

$ tac file2 | sed "2i$(grep mike file1)" | tac

python
bash shell
mike
Java

答案 5 :(得分:0)

创建测试文件

echo -e 'Hi\n123\nBye' > test.txt

enter image description here