提取赋值表达式的值

时间:2011-02-03 23:46:52

标签: bash sed awk text-manipulation

假设我有这个字符串:

a b c d e=x f g h i

仅使用Linux命令(例如xe=x)从sed中提取值awk的最佳方法是什么?

* “最佳”的定义取决于您。

8 个答案:

答案 0 :(得分:3)

如何使用Bash:

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

使用的参数扩展记录为here

使用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

答案 1 :(得分:0)

以下是使用sedawk的单行内容:

$ 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

同时遍历两行中的列

答案 2 :(得分:0)

使用Bash&gt; = 3.2 regexes:

string='a b c d e=x f g h i'
pattern=' [^ ]*=([^ ]*) '
[[ $string =~ $pattern ]]
echo ${BASH_REMATCH[1]}

答案 3 :(得分:0)

grep做什么?假设我正确理解你的问题:

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

其中s='a b c d e=x f g h i'

答案 4 :(得分:0)

GAWK

/=/ {match($0, /\<\w+=\w+\>/, a);print a[0]}

答案 5 :(得分: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

答案 6 :(得分: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"

答案 7 :(得分:0)

使用现代的perl:

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

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

旧的perl:

$ perl -ne 'm/e=(\S*)/; print "$1\n"'