【发布时间】:2011-02-03 23:46:51
【问题描述】:
假设我有这个字符串:
a b c d e=x f g h i
仅使用 Linux 命令(如 sed 和 awk)从 e=x 中提取值 x 的最佳*方法是什么?
*“最佳”的定义取决于你。
【问题讨论】:
标签: bash sed awk text-manipulation
假设我有这个字符串:
a b c d e=x f g h i
仅使用 Linux 命令(如 sed 和 awk)从 e=x 中提取值 x 的最佳*方法是什么?
*“最佳”的定义取决于你。
【问题讨论】:
标签: bash sed awk text-manipulation
这个怎么样,只使用 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 并且不会启动任何额外的进程。
编辑:
根据 cmets,这里是上面的表达式,修改为专门匹配 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
【讨论】:
$ s="${s#*e=}" 特别是 e 值,如果有多个可以有 =
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
过程是使用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]}
【讨论】:
一个可以干净地处理所有这些变量(不确定最终目标)的全 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"
【讨论】:
如果你的 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
【讨论】:
使用现代 perl:
$ perl -nE 'm/e=(\S*)/;说1美元'或
$ perl -pe 's/.*e=(\S*).*/$1/'使用旧版 perl:
$ perl -ne 'm/e=(\S*)/;打印“$1\n”'【讨论】: