3

次の文字列があるとします。

a b c d e=x f g h i

Linux コマンド (や など)のみxを使用して値を抽出する最良の*方法は何ですか?e=xsedawk

* 「最高」の定義はあなた次第です。

4

8 に答える 8

3

Bashだけを使用して、これはどうですか:

$ s="a b c d e=x f g h i"
$ s="${s#*=}"
$ echo "${s%% *}"
x

使用されるパラメーター展開は、ここに記載されています。

を使用した別のものsed

$ s="a b c d e=x f g h i"
$ echo "$s" | sed 's|.*=\([^[:space:]]*\).*|\1|'
x

再びsed

$ s="a b c d e=x f g h i"
$ echo "$s" | sed 's|.*=||; s|[[:space:]].*||'
x

を使用した別のものcut

$ s="a b c d e=x f g h i"
$ echo "$s" | cut -d = -f 2 | cut -d ' ' -f 1
x

私の個人的なお気に入りは最初のものです。必要なのは Bash だけで、追加のプロセスは起動しません。

編集:

コメントに従って、e具体的に一致するように変更された上記の式を次に示します。

$ s="a b c d e=x f g h i"
$ s="${s#*e=}"; echo "${s%% *}"
x
$ s="a b c d e=x f g h i"
$ echo "$s" | sed 's|.*\be=\([^[:space:]]*\).*|\1|'
x
$ echo "$s" | sed 's|.*\be=||; s|[[:space:]].*||'
x
于 2011-02-03T23:50:36.430 に答える
1

しますgrepか?あなたの質問を正しく理解していると仮定します:

echo $s | grep -oP '(?<=e\=)[^ ]*'

どこs='a b c d e=x f g h i'

于 2011-02-04T00:38:34.643 に答える
0

sedとを使用したワンライナーは次のawkとおりです。

$ echo 'a b c d e=x f g h i' | sed 's/=/\n/' | awk '{ getline v; split(v, arr); for (i=1; i<=NF; i++) print $i, "=", arr[i] }'
a = x
b = f
c = g
d = h
e = i

プロセスは、を使用して2行に分割し、=を使用sedして両方の行の列を同時にループすることです。awk

于 2011-02-04T00:14:38.047 に答える
0

Bash> = 3.2正規表現の使用:

string='a b c d e=x f g h i'
pattern=' [^ ]*=([^ ]*) '
[[ $string =~ $pattern ]]
echo ${BASH_REMATCH[1]}
于 2011-02-04T00:17:43.093 に答える
0

gAWK

/=/ {match($0, /\<\w+=\w+\>/, a);print a[0]}
于 2011-02-04T01:21:50.750 に答える
0

最新の perl を使用する場合:

$ perl -nE 'm/e=(\S*)/; $1 と言う

また

$ perl -pe 's/.*e=(\S*).*/$1/'

古い perl の場合:

$ perl -ne 'm/e=(\S*)/; print "$1\n"'
于 2011-02-04T14:02:55.043 に答える
0

Linux システムに Ruby がある場合

$ echo 'a b c d e=x f g h i' | ruby -e 'puts gets.scan(/=(\w+)/)[0][0]'
x

または代替

$ echo 'a b c d e=x f g h i'| tr "=" "\n"| awk 'NR==2{print $1}'
x
于 2011-02-04T01:44:17.147 に答える
0

これらすべての変数をきれいに処理できるすべてのbashソリューション(これの最終的な目標がわからない)

STRING="a b c d e=x f g h i"
export IFS="="
while read -d ' ' var value; do
 echo "$var is $value"
done <<< "$STRING"
于 2011-02-04T01:46:32.960 に答える