使用sed将文件名插入文本文件

时间:2017-04-02 21:23:28

标签: sed filenames

我一直在学习sed并发现它非常有用,但在任何一个指南和示例中找不到答案...我想插入文本文件的文件名,减去它的路径和扩展,进入文本本身的特定行。可能的?

2 个答案:

答案 0 :(得分:1)

在这种情况下,正确的起点应该是手册页。 sed手册没有提供sed理解" filename"的功能,但是sed确实支持在一行之前/之后插入文本。

因此,您需要单独隔离文件名,将文本存储到变量中,并在您希望的行之前/之前注入此文本。

示例:

$ a="/home/gv/Desktop/PythonTests/cpu.sh"
$ a="${a##*/}";echo "$a"
cpu.sh
$ a="${a%.*}"; echo "$a"
cpu

$ cat file1
LOCATION 0 X 0
VALUE 1a 2 3
VALUE 1b 2 3
VALUE 1c 2 3

$ sed "2a $a" file1   # Inject the contents of variable $a after line2
LOCATION 0 X 0
VALUE 1a 2 3
cpu
VALUE 1b 2 3
VALUE 1c 2 3

$ sed "2i $a" file1   # Inject the contetns of variable $a before line2
LOCATION 0 X 0
cpu
VALUE 1a 2 3
VALUE 1b 2 3
VALUE 1c 2 3

$ sed "2a George" file1  #Inject a fixed string "George" after line 2
LOCATION 0 X 0
VALUE 1a 2 3
George
VALUE 1b 2 3
VALUE 1c 2 3

说明:
a="${a##*/}":删除从字符串开头到最后找到的斜杠/(更长匹配)的所有字符 a="${a%.*}":删除从字符串末尾开始到第一个找到的点的所有字符。 (短期比赛)。你也可以使用%%作为最长的点 sed "2a $a":在第2行之后插入变量$ a的内容 sed "2i $q":在第2行之前插入$ a

的内容

您可以选择使用sed -i在流程

下的原位/文件中进行更改

答案 1 :(得分:1)

wrt I've been learning about sed那么你可能一直在浪费你的时间,因为除了s/old/new之外没有太多要了解sed。当然还有很多其他的语言结构和你可以用sed做的事情,但在实践中你应该避免它们,只需使用awk。如果您编辑问题以包含简洁,可测试的样本输入和预期输出并添加awk标记,那么我们可以向您展示如何以正确的方式执行任何操作。

同时,听起来你只需要:

$ cat /usr/tmp/file
a
b
c
d
e

$ awk 'NR==3{print gensub(/.*\//,"",1,FILENAME)} 1' /usr/tmp/file
a
b
file
c
d
e

以上在打开文件的第3行之前插入当前文件名。它使用GNU awk作为gensub(),与其他awks一起使用sub()和变量。