16

例:

    before: text_before_specific_character(specific_character)text_to_be_deleted
    after: text_before_specific_character

「sed」でできることは知っています。しかし、私は立ち往生しています。誰かが私を助けることができますか?

4

3 に答える 3

30

これに 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

于 2012-06-29T16:23:16.690 に答える
11

あなたが探しているものは、実際には本当に簡単です:

sed 's/A.*//'

どこAに特定の文字をマークします。複数の文字をキャッチしたい場合は、大文字と小文字が区別されることに注意してください

sed 's/[aAbB].*//'
于 2012-06-29T16:21:06.717 に答える
2

次のように、TEXT にテキストが含まれている場合

TEXT=beforexafter

特定の文字がたまたま (たとえば) の場合x

echo "${TEXT%x*}"

あなたが望むことをします。

バッシュするには、"$TEXT"または"${TEXT}"全体beforexafterですが、端を切り落とした"${TEXT%xafter}"だけです。とそれに続く可能性のあるものを切り落とすには、と書きます。beforexafterx"${TEXT%x*}"

ついでに もあり"${TEXT%%x*}"ます。これは、複数ある場合にのみ他と異なりxます。を使用する%%と、Bash はすべての を切り捨てますxが、 を使用する%と、最後の のみが切り捨てられxます。%%これは、長いほどテキストが切り落とされることを大まかに観察することで思い出すことができます。

もちろん、必要に応じて、Sed でも同様に行うことができます。

echo "$TEXT" | sed 's/x.*//'
于 2012-06-29T16:32:33.863 に答える