3

假设我有这个字符串:

a b c d e=x f g h i

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

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

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

使用现代 perl:

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

或者

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

使用旧的 perl:

$ perl -ne 'm/e=(\S*)/; 打印“$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 回答
0

gAWK

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

这是一个使用sedand的衬里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

过程是在=using处分成两行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 回答