提取赋值表达式的值

发布于 2024-10-15 23:30:02 字数 261 浏览 3 评论 0原文

假设我有这个字符串:

a b c d e=x f g h i

What's the best* way to extract the value x from e=x using only Linux Commands (like sed and <代码>awk)?

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

Suppose I have this string:

a b c d e=x f g h i

What's the best* way to extract the value x from e=x using only Linux commands (like sed and awk)?

*The definition of "best" is up to you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

羁〃客ぐ 2024-10-22 23:30:02

怎么样,仅使用 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

How about this, using just Bash:

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

The used parameter expansions are documented here.

Another one using sed:

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

Again with sed:

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

Another one using cut:

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

My personal favourite is the first one: it only needs Bash and it does not launch any additional processes.

EDIT:

As per the comments, here are the expressions above, modified to match e specifically:

$ 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
梦醒灬来后我 2024-10-22 23:30:02

grep 可以吗?假设我正确理解你的问题:

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

其中 s='abcde=xfgh i'

Will grep do? Assuming I understand your question correctly:

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

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

渡你暖光 2024-10-22 23:30:02

这是使用 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 同时循环遍历两行中的列

Here is a one liner using sed and 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

Process is to split into two lines at the = using sed, then loop through the columns in both lines simultaneously using awk

单身狗的梦 2024-10-22 23:30:02

使用 Bash >= 3.2 正则表达式:

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

Using Bash >= 3.2 regexes:

string='a b c d e=x f g h i'
pattern=' [^ ]*=([^ ]*) '
[[ $string =~ $pattern ]]
echo ${BASH_REMATCH[1]}
阳光下慵懒的猫 2024-10-22 23:30:02

GAWK

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

gAWK

/=/ {match($0, /\<\w+=\w+\>/, a);print a[0]}
若无相欠,怎会相见 2024-10-22 23:30:02

一个全 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"

An all bash solution which can handle all those variables (not sure of the ultimate goal of this) cleanly

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"
初见终念 2024-10-22 23:30:02

如果你的 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

If you Linux system have Ruby

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

or alternative

$ echo 'a b c d e=x f g h i'| tr "=" "\n"| awk 'NR==2{print $1}'
x
欲拥i 2024-10-22 23:30:02

使用现代 Perl:

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

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

使用旧 Perl:

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

With a modern perl:

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

or

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

With old perl:

$ perl -ne 'm/e=(\S*)/; print "$1\n"'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文