【问题标题】:Understanding 'sed' command了解“sed”命令
【发布时间】:2014-05-05 18:36:44
【问题描述】:

我目前正在尝试在我的机器上安装 GCC-4.1.2:Fedora 20。

在指令中,前三个命令涉及使用 'sed' 命令来修改 Makefile。但是,对于我的情况,我很难正确使用这些命令。 GCC-4.1.2 的网站link

命令是:

sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in &&
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in &&
sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in &&

我试图通过阅读“sed”手册页来理解它们,但这并不容易。任何帮助/提示将不胜感激!

【问题讨论】:

  • 您没有说明为什么要安装旧版本的gcc 以及为什么您希望linuxfromscratch.org 成为在Fedora 上安装它的好来源。另一方面,您没有具体说明您要在此处使用sed 实现的目标和原因。
  • @pavel Simerda:我正在尝试安装 gcc-4.1.2,因为我正在尝试运行一个无法在较新版本中运行的程序。我选择了提供的网站,因为这是我能找到的唯一链接。 (如果你知道一个好的来源,请分享?)如果我知道“sed”命令是用来实现什么的,我就不会在这里问一个问题:然而,我没有分享列出的信息,因为它不是直接的与我的问题有关。
  • 修复程序以使用当前的gcc 构建不是更好吗?这些更改通常不会那么致命,而且对我来说听起来比使用旧版本的编译器要安全得多。通过这种方式,您可以创建一个常规的 Fedora 20 软件包,这比手动构建要方便得多。但如果您需要这方面的帮助,最好提出一个新问题。
  • 是的,我完全同意你的看法,我应该改变程序而不是编译器。程序是别人写的。这是一个相当大的代码。而且我不是足够强大的程序员来找出导致依赖问题的原因。 (如果我问这样一个大问题,我会得到答案吗……?)
  • 如果你准备好努力修复程序,我猜你会得到大部分可以自己修复的微不足道的错误。如果它不是那么微不足道,最好一次发布一个问题,只涉及特定的几行。更改编译器时,通常会收到警告而不是错误。您可能应该检查您的编译器命令行并更改构建系统,使其不包含将警告更改为错误的-Werror

标签: bash shell gcc sed makefile


【解决方案1】:

首先,外壳部分:&&。这只是将命令链接在一起,因此只有在前一行成功运行时才会运行后续每一行。

sed -i 表示“在文件上内联运行这些命令”,即直接修改文件,而不是将更改的内容打印到 STDOUT。这里的每个 sed 命令(字符串)都是一个 substitute 命令,我们可以看出这一点,因为该命令以 s 开头。

Substitute 在文件中查找一段文本,然后替换它。所以顺序总是s/needle/replacement/。看看第一行和最后一行如何具有相同的正斜杠?这是命令(替代)、大海捞针(install_to_$(INSTALL_DEST) 和替换它的文本()之间的传统分隔符。

所以,第一个查找字符串并删除它(空替换)。最后一个查找@have_mktemp_command@ 并将其替换为yes

中间的有点奇怪。看看它是如何以s@ 而不是s/ 开头的?好吧,sed 将允许您使用任何您喜欢的分隔符来将针与替换分开。由于该针中有一个/ (\./fixinc\.sh),因此使用与/ 不同的分隔符是有意义的。它将用-c true 替换文本./fixinc.sh

最后一点:为什么第二根针有\.而不是.?好吧,在像针一样的正则表达式中(但在您的示例中没有使用),一些字符是 magical 并执行 magical fairdust 操作.其中一个神奇的角色是.。为了避免魔法,我们在它前面放了一个\,逃离魔法。 (魔法是“匹配任何字符”,我们想要一个文字句点。这就是原因。)

【讨论】:

  • @heptadecagram:非常感谢您的友好回复。您提供了我正在寻找的确切答案,尤其是关于“灵活分隔符”。
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 2022-07-05
  • 2021-12-25
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多