替换线的开始时奇怪的sed行为

时间:2017-09-20 22:07:20

标签: bash sed

我在Mac OS X的BSD上遇到了一些奇怪的行为。

sed -e '{s/^/   /;s/\(a*\)/\1b/;}'

所以这基本上只是在行的开头添加了一些空格,然后用相同的东西替换任意数量的连续'a',后跟b。

预期:

|Input    |Output
|a        |   ab
|aa       |   aab
|aaa      |   aaab

实际值:

|Input    |Output
|a        |b   a
|aa       |b   aa
|aaa      |b   aaa

反转这两个命令的顺序会产生预期的结果。我对正在进行的事情的理解是将一行读入模式空间,然后按顺序将所有表达式应用于它,然后将下一行读入模式空间并重复该过程。似乎有一些

我也试过

sed -e '{s/^/   /;s/\(a+\)/\1b/;}'

除了添加空格外,什么都不做。

我的问题是,为什么要更换具有此效果的行的开头?

1 个答案:

答案 0 :(得分:3)

*表示零或更多,而不是一个或多个。由于零或更多a 可以是任何内容,b会被放置在行的开头 - 这是最早的位置。

+无法理解sedsed -e 's/^/ /;s/\(a\{1,\}\)/\1b/;' 使用了\{1,\}

您可以使用:

\(foo\)\{1,\}

aa* 表示一个或多个并且是通用的,这意味着您也可以将它用于匹配组,例如:

App::uses('CakeNumber', 'Utility');

如果您正在寻找一个重复的角色,您可以使用:

with open('slatecode test.csv') as f:
   read_data = f.readlines()
   for row in read_data:
      list_of_row_values = row.split(",")
      print (list_of_row_values)

(感谢posix regular expressions提醒我)