文字列を検索し、文字列の一部を知る文字列を返します。

文字列を検索し、文字列の一部を知る文字列を返します。

たとえば、文字列があります。

"Icecream123 AirplaneBCD CompanyTL1 ComputerYU1"

私は文字列にIceCreamの部分文字列が確実に含まれていることを知っていますが、それに続くものがわからないとしましょう。

私の例では、123または別の値です。

grepを使用して文字列内の「Icecream」サブ文字列の存在を検出できますが、

echo $string | grep -oF 'Icecream';

印刷されます

Icecream

完全な部分文字列を印刷するコマンドを使用したいと思います。私の例では、次のようになります。

Icecream123

もちろんついてくるアイスクリームはランダムで、事前には分からないので、こうすることはできない。

$SUBSTRING=$(echo $string | grep -oF 'Icecream')
$SUBSTRINGTRAIL=123
echo $SUBSTRING$SUBSTRINGTRAIL

答え1

grepPerl 準拠の正規表現をサポートしている場合は、貪欲にならないように、次の単語の境界と一致させることができます。

echo "$string" | grep -oP 'Icecream.*?\b'

それ以外の場合は、空白以外の文字の最も長いシーケンスと一致します。

echo "$string" | grep -o 'Icecream[^[:blank:]]*'

または、すべてをシェルに保持し、スペースで始まる最長の末尾の文字シーケンスを削除します。

echo "${string%% *}"

答え2

bashをタグ付けしたので:

[[ $string =~ (Icecream[^ ]*) ]] && result=${BASH_REMATCH[1]}

より一般的には、次のクエリについて説明します$search

[[ $string =~ ($search[^ ]*) ]] && result=${BASH_REMATCH[1]}

...またはパラメータ拡張を使用してください。

# remove any leading text up to -and through- the search text:
x=${string##*$search}

# remove any trailing space onwards
result=$search${x%% *}

答え3

grep知っていることを活用してください-o

$ printf '%s\n' "$string" | grep -o '\<Icecream[^[:blank:]]*'
Icecream123

このパターンは、前に単語以外の文字または行の先頭があり、その後にゼロ個以上の空白以外の文字(スペースやタブではない)が続く文字列と一致\<Icecream[^[:blank:]]*します。IcecreamI


使用awk:

$ printf '%s\n' "$string" | awk -v RS=' ' '/^Icecream/'       
Icecream123

プログラムawkは文字列をスペースで区切られたレコードに分割し、各レコードをテストします。文字列で始まるものは何でも印刷しますIcecream

mawkあるいは、GNUを使用すると、awk次のものも使用できます。

printf '%s\n' "$string" | awk -v RS='[[:blank:]]' '/^Icecream/'

RS複数の文字が含まれていると正規表現として解釈されるためです。


そして次のsedような方法でgrep

$ printf '%s\n' "$string" | sed 's/.*\(\<Icecream[^[:blank:]]*\).*/\1/'
Icecream123

使用/bin/sh:

set -- Icecream123 AirplaneBCD CompanyTL1 ComputerYU1
for string; do
    case $string in
        Icecream*)
            printf '%s\n' "$string"
            break
    esac
done

Perl(の助けを借りてtr):

$ printf '%s\n' "$string" | tr ' ' '\n' | perl -ne '/Icecream\S*/ && print'
Icecream123

そうでなければ

$ printf '%s\n' "$string" | perl -ne '/(Icecream\S*)/ && print $1, "\n"'
Icecream123

答え4

特にgrepバージョンがperl正規表現をサポートしていないと言ったので、もっと簡単になるかもしれません。

$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123

trすべてのスペースを改行文字に置き換えて、文字列を複数行に分割します。これでgrep使いやすいです。

また、次のように書いて探している単語の後に続く内容だけを得ることもできます。

$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123

関連情報