コロンの前にコンテンツを取得する


8

Linuxにテキストファイルがあり、内容は次のようになっています。

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com

以下のようにコロンの前の内容を取得したい:

help.helloworld.com
dev.helloworld.com

どうすればターミナル内でそれを行うことができますか?


2
このgrepユーティリティは、正規表現に一致する行を探すために使用されます。ここで使用することもできますが、cutユーティリティなど、区切り文字を指定してフィールドからデータを抽出するツールを使用する方が適切です。
Kusalananda

「grep」という単語を削除し、タイトルの「find」で置き換え、質問の本文で「get」と編集してgrep、実際の問題を解決する適切なツールであると想定するというX / Yの問題を回避しました。問題。
モンティハーダー

1
私が言えることは、コロンの前の内容がコロンの後の内容よりもはるかに優れているということです;-)。
ピーター-モニカの復活

回答:


35

これは何のcutためのものですか:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

区切り文字を:withに設定して-d:、最初のフィールド(-f1)のみを印刷するように指示します。


19

または代替:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

これ^は、コロン([^:]*)以外の各行()の先頭から始まる文字を返します。


18

間違いなくお勧めしawkます:

awk -F ':' '{print $1}' file

:フィールドセパレータとして使用し、最初のフィールドを印刷します。


5

更新された回答

次のファイルを検討してくださいfile.txt

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

を使用sedして、コロンの後のすべてを削除できます。

sed -e 's/:.*//' file.txt

これは、コメントで指摘されたすべてのコーナーケース(コロンで終了する場合、またはコロンがない場合)で機能しますが、質問自体では言及されていません。コメントを提供してくれた@Rakesh Sharma、@ mirabilos、@ Freddyに感謝します。質問に答えることは学ぶための素晴らしい方法です。


4
sed -e 's/:.*//' file.txtPosix sedの別の方法です。
Rakesh Sharma

1
sed -ne 'y/:/\n/;P' file.txtまた使用することができます。
Rakesh Sharma

Make .+to.*
Rakesh Sharma

暗黙のがありますので@Randyジョセリンはifs///p構文、あなたは、ないコロンとラインのケア、のようなものを取るためにあなたの正規表現を変更する必要がありますsed -nEe 's/([^:]*)(:.*|)/\1/p'。これはGNU sed必須ですが、とにかくあなたはGNU sedを使用しているので、これは問題になりません。
Rakesh Sharma

この答えは私のお気に入りだったかもしれませんが、EREは不要です。sed -n '/:/s/^\([^:]*\):.*$/\1/p--posixGNU sedを使用している場合は、それらの拡張性を
悪用

4

GNU grepが必要です。たとえばmacOSや他のBSDのデフォルトのgrepでは機能しません。

このような意味ですか:

grep -oP '.*(?=:)' file

出力:

help.helloworld.com
dev.helloworld.com

4
行に2つ以上のコロンがある場合、これは最後のコロンまですべてを印刷するため、OPが必要とするものではありません。お試しくださいecho foo:bar:baz | grep -oP '.*(?=:)'。これはOPの例では機能しますが、質問で説明されている一般的なケースでは機能しません。
terdon

コロンは1つしかなく、正常に機能していますが、更新に感謝します
Gabrial Johnas

-1

次のように読み取った各行の文字列から最長一致を直接削除することにより、bash文字列処理でこれを実現できます。

for line in $(cat inputfile); do echo "${line%%:*}"; done

これは、シェルスクリプトでファイルを解析する場合に便利な代替手段となる可能性があります(ただし、cutを使用する方が効率的かもしれないと思います)。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.