我有一个带有内容的文件sedTest.txt:
sdjalsh ABC 123 ashfaladhs
ldjkasf ABC 234 dadas afsf
dafsafs ABC 876 asf dasfaf
我想仅输出123
,234
,876
。
我可以使用
进行管理cat sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/"
我用那种方式,因为通常有grep而不是cat,在这种情况下它可能是
grep ABC sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/"
这在这里没有意义,但这是日志的典型用法。
我想知道:为什么使用[0-9]+
无效?我期望得到与[0-9]*
相同的结果,但似乎没有任何内容被替换(并且打印出未更改的内容)。
答案 0 :(得分:2)
+
是ERE元字符,sed默认使用BRE。使用sed -E ... + ...
或sed ... \+ ...
启用+
的ERE属性,例如
grep 'ABC' sedTest.txt | sed -E 's/ABC ([0-9]+).*/\1/'
并注意,当您使用-E
并且前导.*
没有做任何有用的事情时,您不再需要逃避parens以启用其ERE元字符属性,因此我将其删除。另外,你不需要grep + sed,这样做:
sed -E -n 's/ABC ([0-9]+).*/\1/p' sedTest.txt
但更重要的是你应该真正使用:
awk '$2=="ABC"{print $3}' sedTest.txt
代替清晰度,简洁性,稳健性,可移植性等。
请注意,您应将脚本(sed,awk,grep等)用单引号('
)括起来,而不是双倍("
),除非您在shell决定解释某些内容时感到惊喜在工具看到它们之前,脚本中的值。