回答:
例は役に立つかもしれませんが、私があなたを正しく理解していれば、これはうまくいきます:
echo "Hello: world" | cut -f1 -d":"
これにより、「hello:world」が「hello」に変換されます。
basename
andなどのツールを実行するサブシェルを生成するよりも、Bashの組み込みパラメーター拡張機能を使用する方が良いです。cut
以下のDennisの回答を参照してください
cut
stdinから読み取ることができるため、ファイルの内容など、処理する必要がある非常に長い文字列がある場合は特に優れています。
hello: world
ますか?これは答えの半分です。
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
hello:world
てhello:wo
、次のような特定の文字列になった後に2文字を削除するにはどうすればよい${a%:*}
ですか?
"${a##*:}"
のみ取得するためtomorrow
)=
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'
ます。[[$ a =〜$ pattern]]; 「$ {BASH_REMATCH [1]}」 `をエコーします。コロンがある場合にのみ一致します。これをオプションにする場合は、別のパターンを使用する必要があります。Bashの正規表現(および一般的な正規表現)の説明は、これらのコメントの範囲を超えています。これについて議論したり、独自に投稿したりする他の質問を見つけることができます。
egrep -o '^[^:]*:'
egrep
はgrep -E
です。ここでは通常と違いはありませんgrep
。 -o
式に一致する行の部分のみを出力するようにgrepに指示します。 ^
マッチを行頭に固定します。 [^:]*
文字ではないゼロ個以上の文字に一致します:
。 :
文字に一致します:
。
次の形式のファイルのパスがあるとします。
/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
他のいくつかのケースでは、最後のケースも役立つかもしれません。最後の出力の先頭に「/」がないことに注意してください。
「:」の最後のインスタンスの後のすべてを削除します
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
最後の ":"を削除したい場合
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123:置き換えたいと思います:
し/
(sedのコロンがあるべき場所\/
)
cut
動作しますが、私はデニスの答えがより良く、より柔軟です。それがのような新しいプロセスを生み出すかどうか誰かが知っていcut
ますか?