次の文字列があるとします。
a b c d e=x f g h i
Linux コマンド (や など)のみx
を使用して値を抽出する最良の*方法は何ですか?e=x
sed
awk
* 「最高」の定義はあなた次第です。
次の文字列があるとします。
a b c d e=x f g h i
Linux コマンド (や など)のみx
を使用して値を抽出する最良の*方法は何ですか?e=x
sed
awk
* 「最高」の定義はあなた次第です。
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
しますgrep
か?あなたの質問を正しく理解していると仮定します:
echo $s | grep -oP '(?<=e\=)[^ ]*'
どこs='a b c d e=x f g h i'
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
Bash> = 3.2正規表現の使用:
string='a b c d e=x f g h i'
pattern=' [^ ]*=([^ ]*) '
[[ $string =~ $pattern ]]
echo ${BASH_REMATCH[1]}
/=/ {match($0, /\<\w+=\w+\>/, a);print a[0]}
最新の perl を使用する場合:
$ perl -nE 'm/e=(\S*)/; $1 と言う
また
$ perl -pe 's/.*e=(\S*).*/$1/'
古い perl の場合:
$ perl -ne 'm/e=(\S*)/; print "$1\n"'
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
これらすべての変数をきれいに処理できるすべての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"