извлечь значение выражения присваивания - PullRequest
2 голосов
/ 04 февраля 2011

Предположим, у меня есть эта строка:

a b c d e=x f g h i

Какой лучший * способ извлечь значение x из e=x, используя только команды Linux (например, sed и awk)?

* Определение "лучшего" зависит от вас.

Ответы [ 8 ]

3 голосов
/ 04 февраля 2011

Как насчет этого, используя только 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, и он не запускает никаких дополнительных процессов.

EDIT:

В соответствии с комментариями, приведенные выше выражения изменены, чтобы соответствовать 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
0 голосов
/ 04 февраля 2011

С современным Perl:

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

или

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

Со старым Perl:

$ perl -ne 'm/e=(\S*)/; print "$1\n"'
0 голосов
/ 04 февраля 2011

Решение для всего 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"
0 голосов
/ 04 февраля 2011

Если в вашей системе 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
0 голосов
/ 04 февраля 2011

поглазеть

/=/ {match($0, /\<\w+=\w+\>/, a);print a[0]}
0 голосов
/ 04 февраля 2011

Будет grep делать? Если я правильно понял ваш вопрос:

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

где s='a b c d e=x f g h i'

0 голосов
/ 04 февраля 2011

Использование Bash> = 3,2 регулярных выражений:

string='a b c d e=x f g h i'
pattern=' [^ ]*=([^ ]*) '
[[ $string =~ $pattern ]]
echo ${BASH_REMATCH[1]}
0 голосов
/ 04 февраля 2011

Вот один вкладыш, использующий 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

Процесс заключается в разделении на две строки в = с использованием sed, а затем в цикле по столбцам в обеих строках одновременно с использованием awk

...