理解'sed'命令

时间:2014-05-05 18:36:44

标签: bash shell gcc sed makefile

我目前正在尝试在我的机器上安装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'手册页来理解它们,但这样做并不容易。任何帮助/提示将不胜感激!

1 个答案:

答案 0 :(得分:6)

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

sed -i表示"在文件"上内联运行这些命令,即直接修改文件而不是将更改的内容打印到STDOUT。这里的每个sed命令(字符串)都是替换命令,我们可以告诉它,因为命令以s开头。

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

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

中间的有点奇怪。了解它如何从s@而不是s/开始?好吧,sed会让你使用你喜欢的任何分隔符将针头与替换品分开。由于此针中有/\./fixinc\.sh),因此使用与/不同的分隔符是有意义的。它会将文字./fixinc.sh替换为-c true

最后一点:为什么第二针有\.而不是.?好吧,在正则表达式中就像针一样(但在你的例子中没有使用),一些角色是魔法并做魔法仙尘操作。其中一个神奇的角色是.。为了避免魔法,我们在它前面放了\,远离魔法。 (魔术是"匹配任何角色",我们想要一个字面时间。这就是原因。)