Bash Sed在搜索字符串下面插入空行,然后在下一行插入字符串

Bash Sed在搜索字符串下面插入空行,然后在下一行插入字符串,bash,sed,Bash,Sed,我在传递参数的函数中有一个sed表达式 insert_after_new_line() { if ! grep -q "${2}" "${3}"; then sed -i "/${1}/{N;N;a ${2}}" "${3}" fi } insert_after_new_line search insert textfile.txt 我正在尝试在搜索字符串下面插入一个空行,并在后面插入插入字符串 所以 变成 text text search insert t

我在传递参数的函数中有一个sed表达式

insert_after_new_line() {
    if ! grep -q "${2}" "${3}"; then
        sed -i "/${1}/{N;N;a ${2}}" "${3}"
    fi
}

insert_after_new_line search insert textfile.txt
我正在尝试在搜索字符串下面插入一个空行,并在后面插入插入字符串

所以

变成

text
text
search

insert
text
但我一直在犯错误

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

sed确实用换行符分隔命令。有;但它不适用于所有命令,主要是那些以文件名为参数的命令。;不适用于r或例如a。sed将在命令后读取所有内容,因此sed将${2}解释为单个命令,结果它找不到封闭的},因为它被命令吃掉了。你需要一条新线:

sed -i "/${1}/{N;N;a ${2}
}" "${3}"

sed实际上用换行符分隔命令。有一个,;但它并不适用于所有命令,主要是那些以文件名为参数的命令;不适用于r或例如a。Sed将在命令之后读取所有内容,因此Sed将${2}解释为单个命令,结果它找不到封闭的},因为它被命令吃掉了。你需要一条新线:

sed -i "/${1}/{N;N;a ${2}
}" "${3}"


我测试了这个。在命令行中工作

sed -i  '/search/a \\ninsert' file

我测试了这个。在命令行中工作

sed -i  '/search/a \\ninsert' file
这应该起作用:

sed -i '/search/{G;ainsert 
}' file
您可以用shell变量替换文本,但也可以用双引号替换单引号。

这应该可以:

sed -i '/search/{G;ainsert 
}' file

您可以用shell变量替换文本,但也可以用双引号替换单引号。

如果您希望将所有内容都放在一行中,可以尝试:sed-i'/search/G//插入'file'如果您想将所有内容都放在一行中,可以尝试:sed-i'/search/G//插入文件对于带有命令(如a、c、i、r、r、w、w)的大括号表达式和带有w标志的替换命令,使用两个或多个-e选项或编写脚本并用换行符分隔它们。对于带有命令(如a、c、i、r、r、w)的大括号表达式,W和带有W标志的替换命令使用两个或多个-e选项,或者编写脚本并用换行符分隔它们。