たとえば、文字列があります。
"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
grep
Perl 準拠の正規表現をサポートしている場合は、貪欲にならないように、次の単語の境界と一致させることができます。
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:]]*
します。Icecream
I
使用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