未按预期打印匹配组

时间:2018-06-14 15:23:52

标签: regex sed match

我在csv文件中搜索特定模式。如果其值与[0-9]{5}匹配,我想打印倒数第二列的值。

例如,我们说file.csv只包含一行文字:

col1,col2,col3,12345,col5

所以我试图打印12345。这是我试过的命令:

sed -nr 's/,([0-9]{5}),[^,]*$/\1/p' file.csv

然而,这会打印col1,col2,col312345

然后,我试过

sed -nr 's/.*,([0-9]{5}),[^,]*$/\1/p' file.csv

完美无缺,打印12345

我不知道我是否误解sed或只是一般的正则表达式,但当我在www.regex101.com上测试第一个正则表达式时,它的行为与我原先预期的一样

为什么在模式前加.*会对问题产生影响/解决问题,为什么第一个模式会打印它的作用呢?

1 个答案:

答案 0 :(得分:2)

命令s/pattern/replacement/p需要一行 pattern ,执行替换然后打印整行 >。 1 所以,你有这一行:

col1,col2,col3,12345,col5

您的模式/,([0-9]{5}),[^,]*$/与该行匹配,特别是,12345,col5。您将其替换为捕获组12345,因此该行现在是

col1,col2,col312345

并且p标志打印整行。

在第二个命令中,模式/.*,([0-9]{5}),[^,]*$/也与该行匹配,但这一次,它匹配整行,并替换整行使用捕获组。

1 按照sed的说法,该行被加载到“模式空间”中,您正在操纵模式空间。在每个循环结束时,模式空间被打印(或者每当给出明确的p命令时)。我认为您假设p命令中的s标志仅影响替换部分,但它是整个模式空间。