运行终端命令以下列形式打印输出:
一些不相关的文字
更无关的文字
值A = 3.14
值B = 2.71
也是不相关的文字
我需要shell命令(或awk),它将获得对应于VALUE A(3.14)和VALUE B(2.71)的浮点值,并根据前面的字符串将它们分配给shell变量。使用字符串作为标识并以这种格式提取这些特定行非常重要。
可以避免,但可以将命令输出临时存储在文本文件中进行处理。
答案 0 :(得分:2)
对于您提供的输入,这将按照您的要求执行:
$ declare $(mycommand | sed -n 's/^\([^=]*\) = /\1=/p' | tr ' ' '_')
$ echo $VALUE_A
3.14
$ echo $VALUE_B
2.71
sed
脚本会从mycommand
(您的数据生成器)中挑选出任意一行,其中包含=
左侧单个空格所包围的tr
,删除这些空格并传递它的输出为declare
,它将用下划线替换空格。 input
在当前shell中执行赋值,创建新的环境变量。
分步骤(包含$ cat input
some irrelevant text
more irrelevant text
VALUE A = 3.14
VALUE B = 2.71
also irrelevant text
$ cat input | sed -n 's/^\([^=]*\) = /\1=/p'
VALUE A=3.14
VALUE B=2.71
$ cat input | sed -n 's/^\([^=]*\) = /\1=/p' | tr ' ' '_'
VALUE_A=3.14
VALUE_B=2.71
中的示例数据):
declare
... override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("Touched")
}
将这些作业带出来。
答案 1 :(得分:1)
没有&#34;无关的文字&#34;。如果你的&#34;不相关的文字&#34;例如,包含=
符号,然后某些解决方案将中断。如果它是多线的,其他解决方案将会中断,等等。你必须告诉我们更多关于那个&#34;不相关的文字&#34;如果您想获得一个强大的解决方案,请在示例输入/输出中使用一个具体示例。
话虽如此,一个可能的解决方案取决于你的&#34;无关的文字&#34;要求是:
$ declare $( cat file | awk -F' *= *' -v OFS='=' 'NF>1{gsub(/ /,"_",$1); print}' )
$ echo "$VALUE_A"
3.14
$ echo "$VALUE_B"
2.71
另:
$ declare $( cat file | awk -F' *= *' -v OFS='=' 'NR>2 && NR<5{gsub(/ /,"_",$1); print}' )
将cat file
替换为您正在执行的任何命令,以生成您在问题中显示为示例输入的输出。
有了这个和任何其他解决方案,因为你还没有告诉我们什么&#34;无关的文字&#34;可以/不能包含,您可能会发现文字并不像您所喜欢的那样无关紧要,因为它可能符合我们假设仅存在于&#34中的模式;相关&#34;线。
答案 2 :(得分:0)
执行命令
while read -r a b c d; do [ "$a" = VALUE ] && [ "$c" = = ] && declare "VALUE_$b=$d"; done < <(command)
或者,如果您更喜欢分布在多行上的命令:
while read -r a b c d
do
[ "$a" = VALUE ] && [ "$c" = = ] && declare "VALUE_$b=$d"
done < <(command)
这需要bash。
while read -r a b c d; do
这会启动循环并从标准输入读取,将其分为单词并分配变量a
,b
,c
,d
。
[ "$a" = VALUE ] && [ "$c" = = ] && declare "VALUE_$b=$d"
如果a
为VALUE且c
为等号,则创建名为VALUE_$b
且值为$d
的shell变量。
done
这标志着循环的结束。
< <(command)
这为command
的输出提供了循环输入。
第一个<
表示应该重定向循环的输入。构造<(...)
通过进程替换从command
的输出提供输入。