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