【发布时间】:2014-03-17 19:57:13
【问题描述】:
使用 awk 或 sed,如何从行尾开始打印,直到找到字符串(的第一个实例)。例如,如果flow 是字符串,那么flow.com 将从www.stackoverflow.com 中解析出来,www.flow.stackoverflow.com 也类似
【问题讨论】:
使用 awk 或 sed,如何从行尾开始打印,直到找到字符串(的第一个实例)。例如,如果flow 是字符串,那么flow.com 将从www.stackoverflow.com 中解析出来,www.flow.stackoverflow.com 也类似
【问题讨论】:
sed 是在单行上进行简单替换的出色工具:
sed 's/.*\(flow\)/\1/' file
【讨论】:
试试这条线,如果它适合你:
awk -F'flow' 'NF>1{print FS$NF}' file
替代单线:
awk 'sub(/.*flow/,"flow")' file
测试(我在 EOL 中添加了一些数字,以便我们知道输出来自哪里):
kent$ cat f
www.stackoverflow.com1
and similarly for 2
www.flow.stackoverflow.com3
kent$ awk -F'flow' 'NF>1{print FS$NF}' f
flow.com1
flow.com3
kent$ awk 'sub(/.*flow/,"flow")' f
flow.com1
flow.com3
请注意,如果字符串具有某些特殊含义(对于正则表达式)字符,例如 *, |, [ ...,您可能需要转义这些字符。
【讨论】:
sub(..) 返回一个数字,替换完成的次数。如果为 0,则表示在该行中没有找到“字符串”,我们忽略它。否则,我们从第一个字符切到最后一次出现的字符串。
GNU grep 可以做到:
grep -oP 'flow(?!.*flow).*' <<END
www.stackoverflow.com
nothing here
www.flow.stackoverflow.com
END
flow.com
flow.com
该正则表达式找到“flow”,向前看,没有找到“flow”,然后是该行的其余部分。
这也可以:更简单的正则表达式,但更多的努力:
rev filename | grep -oP '^.*?wolf' | rev
【讨论】: