例:
before: text_before_specific_character(specific_character)text_to_be_deleted
after: text_before_specific_character
「sed」でできることは知っています。しかし、私は立ち往生しています。誰かが私を助けることができますか?
これに sed などの外部ツールを使用する理由はありません。bash は、パラメーター展開を使用して内部的に実行できます。
後にトリミングしたい文字が の場合、:
たとえば:
$ str=foo_bar:baz
$ echo "${str%%:*}"
foo_bar
貪欲な方法とそうでない方法の両方でこれを行うことができます。
$ str=foo_bar:baz:qux
$ echo "${str%:*}"
foo_bar:baz
$ echo "${str%%:*}"
foo_bar
特に、タイトなループ内でこれを呼び出している場合、新しい sed プロセスを開始し、プロセスに書き込み、その出力を読み取り、終了する (PID を取得する) のを待つことは、内部ですべての処理を行うためのかなりのオーバーヘッドになる可能性があります。 bash にはありません。
さて - 多くの場合、これを実行したい場合、本当に必要なのは、変数をフィールドに分割することですread
。
たとえば、次の行を読んでいるとしましょう/etc/passwd
:
line=root:x:0:0:root:/root:/bin/bash
IFS=: read -r name password_hashed uid gid fullname homedir shell _ <<<"$line"
echo "$name" # will emit "root"
echo "$shell" # will emit "/bin/bash"
ファイルから複数の行を処理したい場合でも、これも bash だけで実行でき、外部プロセスはありません。
while read -r; do
echo "${REPLY%%:*}"
done <file
...は、外部ツールを起動する必要なく、:
の各行から最初の行まですべてを出力します。file
あなたが探しているものは、実際には本当に簡単です:
sed 's/A.*//'
どこA
に特定の文字をマークします。複数の文字をキャッチしたい場合は、大文字と小文字が区別されることに注意してください
sed 's/[aAbB].*//'
次のように、TEXT にテキストが含まれている場合
TEXT=beforexafter
特定の文字がたまたま (たとえば) の場合x
、
echo "${TEXT%x*}"
あなたが望むことをします。
バッシュするには、"$TEXT"
または"${TEXT}"
全体beforexafter
ですが、端を切り落とした"${TEXT%xafter}"
だけです。とそれに続く可能性のあるものを切り落とすには、と書きます。before
xafter
x
"${TEXT%x*}"
ついでに もあり"${TEXT%%x*}"
ます。これは、複数ある場合にのみ他と異なりx
ます。を使用する%%
と、Bash はすべての を切り捨てますx
が、 を使用する%
と、最後の のみが切り捨てられx
ます。%%
これは、長いほどテキストが切り落とされることを大まかに観察することで思い出すことができます。
もちろん、必要に応じて、Sed でも同様に行うことができます。
echo "$TEXT" | sed 's/x.*//'