我很喜欢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命令和一堆向前和向后斜线替换等等,但这看起来很荒谬。
答案 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'
我承认不容易理解,但更容易理解。