Bash 如何使用sed在给定的行范围/模式内在匹配之前添加行?

Bash 如何使用sed在给定的行范围/模式内在匹配之前添加行?,bash,sed,Bash,Sed,我想做一个基本的sed-行插入,但要使用给定的行范围 使用给定的示例文件sample.txt: foo tomato apple bar START_MARKER tomato apple kiwifruit pineapple strawberry END_MARKER apple qux 我想在包含“苹果”的“开始标记”和“结束标记”之间的任何一行之前添加一行(比如“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我想做一个基本的
sed
-行插入,但要使用给定的行范围

使用给定的示例文件
sample.txt

foo
tomato
apple
bar
START_MARKER
tomato
apple
kiwifruit
pineapple
strawberry

END_MARKER

apple
qux
我想在包含“苹果”的“开始标记”和“结束标记”之间的任何一行之前添加一行(比如“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。 我的样本将变成:

foo
tomato
apple
bar
START_MARKER
tomato
_____new_line_____
apple
kiwifruit
_____new_line_____
pineapple
strawberry

END_MARKER

apple
qux
我试过:

sed '/^START_MARKER$/,/^END_MARKER$/ /apple/i _____new_line_____' sample.txt
但我得到:

sed:-e表达式#1,字符33:未知命令:`/'

还尝试:

sed '/^START_MARKER$/,/^END_MARKER$/ {/apple/i _____new_line_____}' sample.txt
但我得到:

sed:-e表达式#1,字符0:不匹配的`{'

如果我想在包含“apple”的所有行(不使用开始标记和结束标记)之前添加一个“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

sed '/apple/i _____new_line_____' sample.txt

我缺少将/start/、/end/模式选择与我的//I add line操作链接/组合起来的内容。

GNU sed

$ sed -e '/^START_MARKER$/,/^END_MARKER$/ { /apple/i _____new_line_____' -e '}' ip.txt
foo
tomato
apple
bar
START_MARKER
tomato
_____new_line_____
apple
kiwifruit
_____new_line_____
pineapple
strawberry

END_MARKER

apple
qux
a/c/i
命令之后的所有内容都被视为该命令的参数。因此,您需要使用换行符或如上所示的
-e
选项将它们分开。有关详细信息,请参阅


对于其他
sed
,这可能有效,但不确定,因为我无法测试它:

sed '/^START_MARKER$/,/^END_MARKER$/ {
/apple/i\
_____new_line_____
}' ip.txt

您可以使用以下选项:

sed '/START_MARKER/,/END_MARKER/!b;/apple/ i_____new_line_____' sample.txt > out
其中,
sed
遍历每一行,如果图案“apple”在开始标记和结束标记的范围内,则在“apple”之前插入“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

如果您不将输出定向到文件,则它将在终端屏幕上打印。

这可能适用于您(GNU-sed):

这将在包含
apple
START
END
或文件结尾之间的任何行之前插入一行

要仅在包含
apple
的行之前的
START
END
之间插入一行,请使用:

sed -e ':a;/\n/{/^[^\n]*apple/i\__newline__' -e 'P;D};/START/{:b;N;/END/!bb;ba}' file
这将收集
START
END
之间的行,然后在包含
apple
的行之前插入一行

sed -e ':a;/\n/{/^[^\n]*apple/i\__newline__' -e 'P;D};/START/{:b;N;/END/!bb;ba}' file