我在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上测试第一个正则表达式时,它的行为与我原先预期的一样
为什么在模式前加.*
会对问题产生影响/解决问题,为什么第一个模式会打印它的作用呢?
答案 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
标志仅影响替换部分,但它是整个模式空间。