如何在模式之前和行号之后使用sed
将一行插入到文件中? 以及如何使用相同的shell脚本?
这样在每个模式行之前插入一行:
sed '/Sysadmin/i \ Linux Scripting' filename.txt
这改变了这个使用行号范围:
sed '1,$ s/A/a/'
所以现在如何使用这两个(我不能)在一个模式之前和一个行号或另一种方法之后使用sed
将一行插入到文件中?
你可以写一个sed脚本文件并使用:
sed -f sed.script file1 ...
或者你可以使用(多个) -e 'command'
选项:
sed -e '/SysAdmin/i\ Linux Scripting' -e '1,$s/A/a/' file1 ...
如果你想在一行后附加一些东西,那么:
sed -e '234a\ Text to insert after line 234' file1 ...
我假设你只想在当前行号大于某个值的情况下在行之前插入行(即,如果行号在行号之前,则什么都不做)
如果你不被绑定到sed
:
awk -v lineno=$line -v patt="$pattern" -v text="$line_to_insert" ' NR > lineno && $0 ~ patt {print text} {print} ' input > output
这里是一个如何在一行文件之前插入一行的例子:
示例文件test.txt:
hello line 1 hello line 2 hello line 3
脚本:
sed -n 'H;${x;s/^\n//;s/hello line 2/hello new line\n&/;p;}' test.txt > test.txt.2
输出文件test.txt.2
hello line 1 hello new line hello line 2 hello line 3
NB! 请注意,sed已经开始将换行符替换为无空格 – 这是必需的,否则结果文件在开始时会有一个空行
脚本找到包含“hello line 2”的行,然后在上面插入一个新行 – “hello new line”
sed命令的解释:
sed -n: suppress automatic printing of pattern space H;${x;s/test/next/;p} /<pattern>/ search for a <pattern> ${} do this 'block' of code H put the pattern match in the hold space s/ substitute test for next everywhere in the space x swap the hold with the pattern space p Print the current pattern hold space.