例如
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并搜索“参数扩展”.
更新:
你说:
It’s the characters in the first line of input before the colon. The
input could have multiple line though.
因此,使用grep的解决方案可能不是您的最佳选择,因为它们还会打印可能包含冒号的后续行中的数据.当然,有很多方法可以解决这个问题.我们将从示例输入开始:
$function sample { printf "abc-1234a:foo\nbar baz:\nNarf\n"; } $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
$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 '%s\n' "${line%%:*}" abc-1234a