Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 提取赋值表达式的值_Bash_Sed_Awk_Text Manipulation - Fatal编程技术网

Bash 提取赋值表达式的值

Bash 提取赋值表达式的值,bash,sed,awk,text-manipulation,Bash,Sed,Awk,Text Manipulation,假设我有这个字符串: a b c d e=x f g h i 仅使用Linux命令(如sed和awk)从e=x提取值的最佳*方法是什么 *“最佳”的定义取决于您。如何使用just 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:]]*\).

假设我有这个字符串:

a b c d e=x f g h i
仅使用Linux命令(如
sed
awk
)从
e=x
提取值的最佳*方法是什么


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

如何使用just 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
$ s="a b c d e=x f g h i"
$ echo "$s" | sed 's|.*=||; s|[[:space:]].*||'
x
再次使用
sed

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

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

$echo'abcde=xfghi'| sed's/=/\n/'| awk'{getline v;split(v,arr);for(i=1;i使用Bash>=3.2正则表达式:

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

grep
行吗?假设我正确理解了你的问题:

echo $s | grep -oP '(?<=e\=)[^ ]*'
echo$s | grep-oP'(?呆呆
/=/{match($0,/\/,a);打印[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

一个可以干净地处理所有这些变量(不确定最终目标)的全bash解决方案

STRING=“a b c d e=x f g h i”
导出IFS=“=”
读取-d“”变量值时;执行
echo“$var是$value”
使用现代perl完成:

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

$perl-pe's/*e=(\s*).*/$1/' 使用旧的perl:

$ perl -ne 'm/e=(\S*)/; print "$1\n"' $perl-ne'm/e=(\S*)/;打印“$1\n”
Do:
$s=“${s#*e=}”
如果不止一个可以有an=@evan:agreed,那么具体地说就是e值-在所有其他情况下,这也可以相应地修改。但是OP应该有一个更完整的测试输入,如果他想让我们处理它:-)谢谢,尽管我在阅读了其他答案后意识到我可能误解了这个问题,哎呀!这似乎仍然有潜在的用处,所以我将不再讨论它。 $ perl -ne 'm/e=(\S*)/; print "$1\n"'