【问题标题】:Using sed to replace the same text line in multiple files使用 sed 替换多个文件中的同一文本行
【发布时间】:2019-03-22 04:16:12
【问题描述】:

在我的当前目录(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' {} \;

基本上,我需要切换:

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

./makeprog

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

sed: -e expression #1, char 43: unknown option to `s'

我已经看过了:

我相信我的错误是由 ./command 引起的。我遵循了将所有 / 切换为 + 的建议,但这仍然不起作用,因为我收到以下错误:

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

谢谢。

【问题讨论】:

  • 嗨@kvantour,我不这么认为。我看到了,但这不是我关心的明确路径,它正在切换一个包含 ./ 的命令。/我找到了那篇文章并尝试按照将 / 切换为 + 的建议进行操作,但它仍然没有用。跨度>
  • 基本上你已经有了正确的命令。唯一的失败:斜杠字符是您的“模式”的一部分,这就是为什么您必须转义它或为 sed 使用另一个“分隔符”,例如 # char: sed 's#./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib"#./makeprog#g'
  • 斜杠会给您错误“s 的未知选项”。另一个问题是你的美元符号。你必须逃离他们。
  • @kvantour $ 符号无关紧要,只要使用单引号即可。
  • @kvantour:如果$ 位于正则表达式的末尾,那就是真的。否则视为普通字符。

标签: bash sed centos7


【解决方案1】:

您的问题是您使用斜杠作为s/// 命令的分隔符,但您将斜杠放入模式中。您可以选择未出现在模式中的不同分隔符。

假设你的当前目录是 projDir,并且只有一次 makeprog 调用:

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

perl -i -e 's{./makeprog\K.*}{}' */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

【讨论】:

  • 嗨@glenn jackman,谢谢你的回答。这非常有效。您能否解释一下 .*#\1# 正在做什么,以便我学习?
  • 在左侧,正则表达式模式,我在(./makeprog) 周围加上括号。在右侧,替换字符串,您可以使用\n 来使用在nth 括号组中匹配的文本。有关文档,请参阅3.3 The s Command
猜你喜欢
  • 2017-11-08
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 2022-08-13
  • 2013-11-01
  • 2013-04-21
相关资源
最近更新 更多