学习Bash - 配置文件

时间:2014-07-06 20:12:27

标签: 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 ||
echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
      /^X\/\(\/\/\)$/{ s//\1/; q; }
      /^X\/\(\/\).*/{ s//\1/; q; }
      s/.*/./; q'`

任何人都可以解释这是如何工作的吗?我看到很多人使用sed命令和一堆向前和向后斜线替换等等,但这看起来很荒谬。

1 个答案:

答案 0 :(得分:2)

首先,我绝对建议您查看此link

其次,我会进入一些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'
我承认不容易理解,但更容易理解。