Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Bash 使用sed替换多个文件中的同一文本行_Bash_Sed_Centos7 - Fatal编程技术网

Bash 使用sed替换多个文件中的同一文本行

Bash 使用sed替换多个文件中的同一文本行,bash,sed,centos7,Bash,Sed,Centos7,在我当前的目录(projDir)中,我有大约41个文件夹,如下所示: ProgOneDir ProgTwoDir ProgThreeDir ProgFortyOneDir …等等(我没有提出命名方案,我不是系统管理员,所以请不要为他们对我大喊大叫) 在每个子文件夹中,都有需要编辑的README.md文件。我不想进入每个子文件夹并编辑其中的文件,而是想使用sed命令来完成这项工作。这些文件始终命名为README.md 我正在运行CentOS7 我当前的命令是: find . -name 'R

在我当前的目录(projDir)中,我有大约41个文件夹,如下所示:

  • ProgOneDir
  • ProgTwoDir
  • ProgThreeDir
  • ProgFortyOneDir
…等等(我没有提出命名方案,我不是系统管理员,所以请不要为他们对我大喊大叫)

在每个子文件夹中,都有需要编辑的README.md文件。我不想进入每个子文件夹并编辑其中的文件,而是想使用sed命令来完成这项工作。这些文件始终命名为README.md

我正在运行CentOS7

我当前的命令是:

find . -name 'README.md' -exec sed -i -e 's/./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib"/./makeprog/g' {} \;
sed: -e expression #1, char 43: unknown option to `s'
基本上,我需要切换:

./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib

有人能帮忙吗?我得到的错误是:

find . -name 'README.md' -exec sed -i -e 's/./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib"/./makeprog/g' {} \;
sed: -e expression #1, char 43: unknown option to `s'
我已经看过:

  • 其他一些在线资源
我相信我的错误是由./command引起的。我已经按照建议将所有/切换到+,但仍然不起作用,因为我得到了以下错误:

sed: -e expression #1, char 110: unterminated `s' command

谢谢。

您的问题是使用斜杠作为
s//
命令的分隔符,但您在模式中使用斜杠。您可以选择不显示在模式中的其他分隔符

假设您当前的目录是projDir,并且只有一个对makeprog的调用:

sed -i -E 's#(./makeprog) .*#\1#' */README.md

如果要特别匹配该精确行,则:

# are you missing a trailing double quote?
line='./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib'
sed -i -E "s#$line#./makeprog#" */README.md

嗨@kvantour,我想不是。我看到了,但我关心的不是路径,而是切换一个包含的命令。/我找到了那篇文章,并尝试按照切换/到+的建议进行操作,但仍然不起作用。基本上,您确实拥有正确的命令。唯一的失败:斜杠字符是“模式”的一部分,这就是为什么您必须对其进行转义或为sed使用另一个“分隔符”,例如#char:
sed's#./makeprog$MAKE#u FLAGS CFLAGS=“-I/usr/local/include/libtool”of lags=“-L/usr/local/lib”./makeprog'
斜杠为您提供了错误“未知”选项。另一个问题是你的美元符号。您必须将它们转义。@kvantour$符号只要使用单引号就行。@kvantour:如果
$
位于regexp的末尾,则这是正确的。否则它会被认为是一个正常的角色。嗨@glenn jackman,谢谢你的回答。这很有效。请您解释一下。*#\1#在做什么,好让我学习一下吗?在左侧的正则表达式模式中,我在
(./makeprog)
周围加了括号。在右侧的替换字符串中,您可以使用
\n
来使用括号中的
n
组中匹配的文本。有关文档,请参阅