我在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/;}'
除了添加空格外,什么都不做。
我的问题是,为什么要更换具有此效果的行的开头?
答案 0 :(得分:3)
*
表示零或更多,而不是一个或多个。由于零或更多a
可以是任何内容,b
会被放置在行的开头 - 这是最早的位置。
+
无法理解sed
,sed -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提醒我)