例えば
echo "abc-1234a :" | grep <do-something>
印刷のみabc-1234a
これらはあなたが目指しているものに近いと思いますが、実際に何を達成しようとしているのかを知らなければ、何とも言えません。
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