bashで文字の後のすべてのテキストを削除するにはどうすればよいですか?


147

bashで文字(この場合はコロン( ":"))の後のすべてのテキストを削除するにはどうすればよいですか?コロンも削除できますか?どうすればいいのかわかりません。

回答:


135

例は役に立つかもしれませんが、私があなたを正しく理解していれば、これはうまくいきます:

echo "Hello: world" | cut -f1 -d":"

これにより、「hello:world」が「hello」に変換されます。


5
cut動作しますが、私はデニスの答えがより良く、より柔軟です。それがのような新しいプロセスを生み出すかどうか誰かが知っていcutますか?
JoBu1324 2014

3
basenameandなどのツールを実行するサブシェルを生成するよりも、Bashの組み込みパラメーター拡張機能を使用する方が良いです。cut以下のDennisの回答を参照してください
Louis Maddox

1
cutstdinから読み取ることができるため、ファイルの内容など、処理する必要がある非常に長い文字列がある場合は特に優れています。
Sahasは

1
そして、これはどのように適用されhello: worldますか?これは答えの半分です。
K-SOの毒性が高まっています。

また、同様にsubsitution構文を使用して行うことができます{VAR /:/「」}が、bashでのみ動作します。..
マヘシュ

264

Bash(およびksh、zsh、dashなど)では、パラメーター拡張を使用し%て、文字列の末尾から文字#を削除したり、文字列の先頭から文字を削除したりできます。これらの文字を1つ使用すると、一致する最小の文字列が削除されます。キャラクターを2倍にすると最長が削除されます。

$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow

6
これはネイティブのシェル文字列操作であるため、追加のプロセスは生成されません。参考バッシュパラメータの置換bashの文字列操作より良いバッシュスクリプティング
Dodzi Dzakuma

@denniswilliamson を使用しhello:worldhello:wo、次のような特定の文字列になった後に2文字を削除するにはどうすればよい${a%:*}ですか?
3kstc 2016年

グレート答え、ありがとうございましたが、また、追加して素敵になります"${a##*:}"のみ取得するためtomorrow)=
avtomaton

1
@openCivilization:おそらく正規表現の一致を使用する必要がありa='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'ます。[[$ a =〜$ pattern]]; 「$ {BASH_REMATCH [1]}」 `をエコーし​​ます。コロンがある場合にのみ一致します。これをオプションにする場合は、別のパターンを使用する必要があります。Bashの正規表現(および一般的な正規表現)の説明は、これらのコメントの範囲を超えています。これについて議論したり、独自に投稿したりする他の質問を見つけることができます。
追って通知があるまで一時停止。

1
@ kp123:これは私の回答の最初の例です。2回目に(「明日」が削除されている)表示するのは、ほぼ正確にあなたが尋ねている状況です。
追って通知があるまで一時停止。


4
egrep -o '^[^:]*:'

これを解釈する方法を説明できますか、ありがとうございます。
rɑːdʒɑ

1
egrepはgrep -Eです。ここでは通常と違いはありませんgrep-o式に一致する行の部分のみを出力するようにgrepに指示します。 ^マッチを行頭に固定します。 [^:]*文字ではないゼロ個以上の文字に一致します::文字に一致します:
cdhowie 2016

もう一度説明してくれてありがとう
rɑːdʒɑ

3

次の形式のファイルのパスがあるとします。

/dirA/dirB/dirC/filename.file

これで、4つの「/」を含むパスのみが必要になります。タイプ

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"

そしてあなたの出力は

/dirA/dirB/dirC

cutを使用する利点は、uppestディレクトリとファイル(この例では)を切り取ることもできるため、次のように入力した場合

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"

あなたの出力は

/dirA/dirB

文字列の反対側から同じことを行うことができますが、この場合は入力するほど意味がありません。

$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"

結果は

dirA/dirB/dirC

他のいくつかのケースでは、最後のケースも役立つかもしれません。最後の出力の先頭に「/」がないことに注意してください。


2
「/resources/views/admin/users/relationships/posts.blade.php」というディレクトリがあり、「/」が最後に出現した後、「/」の数がわからない場合にすべてを切り捨てたい場合"文字は文字列にあります。したがって、ここでは出力を "/ resources / views / admin / users / relationships /"(または/ resources / views / admin / users / relationshipsに末尾のスラッシュを付けずに)にしたいとします。どうしますか
kp123

-1

「:」の最後のインスタンスの後のすべてを削除します

cat fileListingPathsAndFiles.txt | grep -o '^.*:'

最後の ":"を削除したい場合

cat file.txt | grep -o '^.*:' | sed 's/:$//'

@ kp123:置き換えたいと思います:/(sedのコロンがあるべき場所\/

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