unix 如何使用sed在模式之前和行号之后插入一行?

h43kikqp  于 2022-11-04  发布在  Unix
关注(0)|答案(5)|浏览(216)

如何使用sed在一个模式之前和行号之后插入一行到一个文件中?如何在shell脚本中使用同样的方法?
这将在具有以下模式的每行之前插入一行:

sed '/Sysadmin/i \ Linux Scripting' filename.txt

这将使用行号范围更改此设置:

sed '1,$ s/A/a/'

那么,现在如何使用这两种方法(我不能使用)在模式之前和行号之后使用sed或其他方法将一行插入到文件中呢?

o4tp2gmn

o4tp2gmn1#

您可以编写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 ...
b91juud3

b91juud32#

我假设您只想在当前行号大于某个值时在模式之前插入行(即如果模式出现在行号之前,则不执行任何操作)
如果您未绑定到sed

awk -v lineno=$line -v patt="$pattern" -v text="$line_to_insert" '
    NR > lineno && $0 ~ patt {print text}
    {print}
' input > output
2exbekwf

2exbekwf3#

下面是一个如何在文件中一行之前插入一行的示例:
示例文件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

注意!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.
brjng4g3

brjng4g34#

简单?从第12行到最后:

sed '12,$ s/.*Sysadmin.*/Linux Scripting\n&/' filename.txt
lsmd5eda

lsmd5eda5#

匹配行之前插入一行

sed '/^line starts with.*/i insert this line before' filename.txt

输出量:

insert this line before
line starts with

匹配行后插入一行

sed '/^line starts with.*/a insert this line after' filename.txt

输出量:

line starts with
insert this line after

相关问题