我有这个输入文件:
...
https://long-url/something?value1=999&something=xyz?value2=555
https://long-url/something?value1=534&something=xyz?value2=2312
https://long-url/something?value1=534&something=xyz?value2=233
https://long-url/something?value1=534
...
我想捕获 value1 和 value2 并将它们输出为 csv,并删除任何不匹配的行:
...
999,555
534,2312
534,233
...
我在捕获值方面没有问题,但我在删除任何不需要的行时遇到了问题:
sed 's/.*categoryid=\([0-9]*\).*courseid=\([0-9]*\).*/\1,\2/g;/^[^0-9]\+/d' input-file
基本上,/^[^0-9]\+/d
它没有按预期工作。我在想它会删除任何不以任何数字开头的行,但相反,它给了我:
999,555
534,2312
534,233
我的 sed 版本:sed (GNU sed) 4.7
您的表达式
^[^0-9]\+
强制匹配至少一个非数字,这意味着空行不会匹配它,因为它们不包含非数字。就个人而言,我会这样做:
这首先会删除所有与您的特定正则表达式不匹配的行(例如,空行)。第二个表达式执行替换。当使用空模式时(如第二个表达式中的替换),最近使用的模式将被重新使用。
请注意,您不需要
/g
在替换命令的末尾,因为您只希望每个输入行匹配一次模式。您正在使用替代品,然后是删除:
这有点不稳定,因为您
/.../d
可能会不小心匹配文件内容中的其他内容。相反,我只会打印受替代品影响的行。这可以通过
-n
(默认情况下避免打印)来完成,然后添加p
到行尾以打印匹配的行。这避免了第二个sed
声明的需要。我还将删除尾随
g
,因为每行不需要超过一个匹配项:结果是:
在行动:
输出
要匹配
/^[^0-9]\+/
,该行必须至少包含一个字符,即不能为空。只是不要删除以数字开头的行: