linux – 如何使用grep / awk / sed打印所有字符,直到某个模式(
例如
echo "abc-1234a :" | grep <do-something> 只打印abc-1234a 解决方法
我认为这些更接近你所得到的,但不知道你真正想要达到的目标,很难说.
echo "abc-1234a :" | egrep -o '^[^:]+' …虽然这也会匹配没有冒号的行.如果你只想要带冒号的行,并且你必须只使用grep,这可能有效: echo "abc-1234a :" | grep : | egrep -o '^[^:]+' 当然,这只有在您的回声“abc-1234a:”是一个可能被多行输入替换的示例时才有意义. 你可以使用的最小工具可能是削减: echo "abc-1234a :" | cut -d: -f1 并且sed总是可用的…… echo "abc-1234a :" | sed 's/ *:.*//' 对于最后一个,如果您只想打印包含冒号的行,请将其更改为: echo "abc-1234a :" | sed -ne 's/ *:.*//p' 哎呀,你甚至可以用纯粹的bash做到这一点: while read line; do field="${line%%:*}" # do stuff with $field done <<<"abc-1234a :" 有关%%位的信息,您可以使用bash并搜索“参数扩展”. 更新: 你说:
因此,使用grep的解决方案可能不是您的最佳选择,因为它们还会打印可能包含冒号的后续行中的数据.当然,有很多方法可以解决这个问题.我们将从示例输入开始: $function sample { printf "abc-1234a:foonbar baz:nNarfn"; } $sample abc-1234a:foo bar baz: Narf 您可以使用多个管道,例如: $sample | head -1 | grep -Eo '^[^:]*' abc-1234a $sample | head -1 | cut -d: -f1 abc-1234a 或者您可以使用sed仅处理第一行: $sample | sed -ne '1s/:.*//p' abc-1234a 或者告诉sed在打印第一行后退出(这比读取整个文件要快): $sample | sed 's/:.*//;q' abc-1234a 或者做同样的事情,但只有在找到冒号时才显示输出(为安全起见): $sample | sed -ne 's/:.*//p;q' abc-1234a 或者让awk做同样的事情(分别是最后3个例子): $sample | awk '{sub(/:.*/,"")} NR==1' abc-1234a $sample | awk 'NR>1{nextfile} {sub(/:.*/,"")} 1' abc-1234a $sample | awk 'NR>1{nextfile} sub(/:.*/,"")' abc-1234a 或者在bash中,根本没有管道: $read line < <(sample) $printf '%sn' "${line%%:*}" abc-1234a (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |