Sed 学习Bash-Configure文件

Sed 学习Bash-Configure文件,sed,sh,configure,Sed,Sh,Configure,我对bash很在行,我喜欢通过查看别人的作品和下载的文件来学习,我在一个配置文件中发现了这一点 # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || ech

我对bash很在行,我喜欢通过查看别人的作品和下载的文件来学习,我在一个配置文件中发现了这一点

    # Name of the executable.
as_me=`$as_basename "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
     X"$0" : 'X\(//\)$' \| \
     X"$0" : 'X\(/\)$' \| \
     .     : '\(.\)' 2>/dev/null ||
echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
      /^X\/\(\/\/\)$/{ s//\1/; q; }
      /^X\/\(\/\).*/{ s//\1/; q; }
      s/.*/./; q'`

有人能解释一下这是怎么回事吗?我看到很多人在使用sed命令时,使用了一大堆向前和向后的斜杠来表示替换等等,但这似乎很荒谬。

首先,我肯定会建议检查一下这个命令

其次,我将介绍一些
sed
内容:

  • sed'/
    :这是正则表达式搜索的开始
  • ^.*
    :搜索行首(
    ^
    )并搜索任何字符(
    )的任何金额(即零或更多:
    *
    ),请注意,在
    []
    中使用
    ^
    表示不在列表中
  • /\([^/][^/]*\)
    :然后搜索一个斜杠,后跟一组不包含斜杠的字符(
    [^/][^/]*
    )。
    \(…\)
    标记了以后可以引用的组。我以后再谈
  • \/*$
    :然后搜索任意数量的斜杠,然后搜索行尾(
    $
  • /
    :出现第二个未转换的斜杠标志着正则表达式的结束,以及当它找到与正则表达式匹配的行时,
    sed
    应该做的事情的开始
  • {s//\1/;q;}
    :不幸的是,我不知道大括号的确切用途。通常,它们用于对命令进行分组,但我从未在斜杠的这一部分中看到它的使用。无论如何,正如前面提到的
    sed
    允许反向引用<代码>\1引用前两个斜杠之间的第一个(也是唯一的)分组;也就是说,
    [^/][^/]*
    q
    用于在完成该命令时退出
    sed
    ,但由于它在大括号中,我不确定这对整个命令有何影响
无论如何,这应该能让你很好地理解
sed
的工作原理。据我所知,
sed
似乎正在查看一个文件路径并获取其中的一部分。例如,它被传递到
some/crazy/file/location.ext
它将返回
crazy

希望有帮助!确保你检查了这个链接,因为一旦掌握了窍门,它是一个非常有用的工具。哦,如果您曾经使用
sed
请使用
或甚至
作为分隔符!!这防止了
sed的讨厌的纠察栅栏外观参见上文。它可以写成

sed ':^.*/\([^/][^/]*\)/*$:{ s::\1:; q; }
      :^X/\(//\)$:{ s::\1:; q; }
      :^X/\(/\).*:{ s::\1:; q; }
      s:.*:.:; q'

我承认这不容易理解,但更容易阅读。

这是从哪个配置文件来的?你应该改为括号,而不是旧的和过时的背景。var=$(代码)很好,因为它不是我的,我可以同意。如果您想向制造商推荐gtk-server-2.3.1,那么谷歌可能是因为需要使用尽可能多的
sh
sed
实现,才出现了可怕的外观,包括一些甚至可能早于POSIX标准的命令。可能会运行3种不同的命令:一种命令名为
$as_basename
,另一种命令名为
$as_expr
,最后一种方法是
sed
as_basename
as_expr
很可能分别是POSIX
basename
expr
命令。