1

所以我有一个文件夹,里面有更多文件夹。我想告诉一个朋友,他们应该,而不是每个文件夹都包含源文件,而应该只包含每个源文件,每个源文件都包含多个功能;

即代替这个:

src/
    load_of_functions/
        function1.py
        function2.py
        function3.py
        function4.py
    load_more_functions/
        function5.py
        function6.py
        function7.py
    even_more_funcitons/
        function9.py
        function10.py

他们应该有这个:

src/
    load_of_functions.py
    load_more_functions.py
    even_more_funcitons.py

所以我进入了目录,做了一个小班轮,把目录的名字写进电子邮件;

$ ls -l | grep ^d | awk '{print $9}' | perl -pe 's/(.*)/\1.py/g'

ls -l获取文件和所有信息 grep ^d以仅保留目录 awk '{print $9}'以仅打印第 9 列 - 即目录名称perl -pe 's/(.*)/\1.py/g'并将“.py”添加到每一行。

当我这样做时,我得到了这个:

$ ls -l | grep ^d | awk '{print $9}' | perl -pe 's/(.*)/\1.py/g'
1.py.py
10.py.py
2.py.py
3.py.py
4.py.py
5.py.py
6.py.py
7.py.py
8.py.py
9.py.py

我知道我不是在解析文件,而是逐行解析,因此g不需要 for global。所以我把它拿出来,它工作正常。

这可以。

但是为什么当我放入时它会替换两次g?这对我来说毫无意义!

4

1 回答 1

4

.*匹配零个或多个字符,这意味着它可以匹配零个字符。

假设你有

$_ = 'abc';
s/(.*)/\1.py/g;

第一次搜索匹配项时,它匹配substr($_,0,3),然后/g导致它检查从 pos 3 或更晚开始的另一个匹配项。

第二次搜索匹配时,它匹配substr($_,3,0),然后/g导致它检查从 pos 3 或更高位置开始的另一个匹配。

第三次搜索匹配时,它匹配substr($_,3,0)。但是,引擎拒绝匹配相同的子字符串(定义为具有相同的起始位置和相同的长度)两次,因此它失败了。

解决方案:

s/(.*)/\1.py/;    # Poor
s/^(.*)/\1.py/g;  # Poor
s/^(.*)/\1.py/;   # Ok
s/$/.py/;         # Better
$_ .= '.py';      # Best if -l was present
于 2013-04-15T17:33:37.520 回答