我如何可以打印所有的字符,直到一定的模式(不包括模式本身)用grep / awk的/ SED。(Ho

2019-06-28 04:24发布

例如

echo "abc-1234a :" | grep <do-something>

刚刚打印ABC-1234A

Answer 1:

我觉得这些都是接近你在说什么,但不知道你真正想实现的,这是很难说。

echo "abc-1234a :" | egrep -o '^[^:]+'

...虽然这也将匹配没有冒号线。 如果你只是想用冒号线,你只能使用grep的,这可能工作:

echo "abc-1234a :" | grep : | egrep -o '^[^:]+'

当然,这仅是有道理的,如果你的echo "abc-1234a :"是,将与输入的可能多行被替换的例子。

你可以用最小的工具可能是cut

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 :"

有关信息%%位,可以man bash ,搜索“ 参数扩展 ”。

更新

你说:

这是在输入的冒号前的第一行的字符。 输入可以有多个行虽然。

与解决方案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

或者告诉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 '%s\n' "${line%%:*}"
abc-1234a


文章来源: How can i print the all the characters until a certain pattern(excluding the pattern itself) using grep/awk/sed.