Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行包含sed命令的bash脚本不会产生任何结果,只是挂起。为什么?_Bash_Sed - Fatal编程技术网

运行包含sed命令的bash脚本不会产生任何结果,只是挂起。为什么?

运行包含sed命令的bash脚本不会产生任何结果,只是挂起。为什么?,bash,sed,Bash,Sed,我有下面的示例代码和所需的输出 示例: #!/bin/bash if [ "$1" = "fileName" ]; then sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;' -e '}' -e'/patternWD4/,/patternWD5/{/patternWD6/i new_line_of_code_2;' -e '}' < "$1" fi void函数 { 一些代码; 一

我有下面的示例代码和所需的输出

示例:

#!/bin/bash

if [ "$1" = "fileName" ]; then
   sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;' -e '}'
       -e'/patternWD4/,/patternWD5/{/patternWD6/i new_line_of_code_2;' -e '}' < "$1"
fi
void函数
{
一些代码;
一些代码模式WD3;
一些代码;
}
/*一些注释模式WD2*/
空洞函数_patternWD4()
{
一些代码;
一些代码模式WD6;
一些代码;
}
/*一些评论*/
所需输出:

#!/bin/bash

if [ "$1" = "fileName" ]; then
   sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;' -e '}'
       -e'/patternWD4/,/patternWD5/{/patternWD6/i new_line_of_code_2;' -e '}' < "$1"
fi
void函数
{
一些代码;
sed命令之后的新\u行\u(代码为\u 1;//的)
一些代码模式WD3;
一些代码;
}
/*一些注释模式WD2*/
空洞函数_patternWD4()
{
一些代码;
sed命令之后的新\u行\u(代码为\u 2;//的)
一些代码模式WD6;
一些代码;
}
/*一些评论*/
我所尝试的:

#!/bin/bash

if [ "$1" = "fileName" ]; then
   sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;' -e '}'
       -e'/patternWD4/,/patternWD5/{/patternWD6/i new_line_of_code_2;' -e '}' < "$1"
fi
#/bin/bash
如果[“$1”=“文件名”];然后
sed-e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;'-e'}'
-e'/patternWD4/,/patternWD5/{/patternWD6/i新的第2行代码'-e'}'<“$1”
fi
起初,我已经试过了

#!/bin/bash

if [ "$1" = "fileName" ]; then
   sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;}' < "$1"
fi
#/bin/bash
如果[“$1”=“文件名”];然后
sed-e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;}'<“$1”
fi
但它不起作用,所以我在这里问了一个问题,一位投稿人纠正了它,让我回答

#!/bin/bash

if [ "$1" = "fileName" ]; then
   sed -e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;' -e '}' < "$1"
fi
#/bin/bash
如果[“$1”=“文件名”];然后
sed-e'/patternWD1/,/patternWD2/{/patternWD3/i new_line_of_code_1;'-e'}'<“$1”
fi
这对于单个命令很好,但是当我像在我尝试的那样使用它时:
,脚本在挂起时似乎不起作用,我看不到任何结果


有人能解释一下这个命令用法背后的语法吗?为什么我的命令不起作用,而另一个命令却起作用了?

正如人们已经评论的那样,您缺少了一个反斜杠来告诉bash您的命令跨越两行

如果将右大括号直接放在分号之后,sed会将其解释为属于要插入的字符串。因此,必须通过关闭表达式并将右大括号放入自己的表达式中来结束字符串

如果需要匹配周围代码的缩进,则需要转义第一个空格,使sed意识到要插入的字符串正在开始。在您的例子中,如果缩进有三个空格,请在代码的新行前面加上反斜杠和三个空格

应用这些更改后,相关行为:

sed-e'/patternWD1/,/patternWD2/{/patternWD3/i\new_line_of_code_1;'-e'}\

-e'/patternWD4/,/patternWD5/{/patternWD6/i\new_line_of_code_2;'-e'}'
bash
用行解析命令。您正在运行
sed-e….
命令,无需任何输入。也许你想要
sed-e-e、 -e、 ..<“$1”
作为一条长线。您是否从
sed--version
获得任何输出?否则发布
uname-srv
的输出。祝你好运。
-e'}'
之后缺少一个反斜杠表示行继续。谢谢@Kamil Cuk和@Jens。我可以按照你的建议去做。但是我仍然有一个问题,额外的
-e
}
周围的单引号的目的是什么?为什么不能是这个
sed-e'/patterWD1/,/patterwd2/{/patterwd3/i new_line_of_code_1;}'
?@大师我已经在回答你之前的问题时解释过了,请阅读并让我知道还有什么尚不清楚。